Pplware

PHP é a Quinta-Feira – HEADERs (parte 1)

Por Pedro Peixoto para o PPLWARE Depois de umas longas “férias”, hoje é dia de mais um artigo sobre “Programação WEB”, mais precisamente sobre PHP.

Na outra semana um amigo perguntou-me como poderia forçar o download de uma imagem, uma vez que sempre que colocava um link, o browser abria a imagem em vez de aparecer a “janelinha de download” como nos restantes ficheiros. Isto acontece porque existem diversos tipos de ficheiros que o browser consegue interpretar, e nesse caso, o ficheiro é mostrado imediatamente em vez de ser perguntado ao utilizador onde quer guardar o ficheiro para posteriormente o visualizar. É possível contornar este “automatismo” forçando o browser a questionar o utilizador sobre a sua intenção, para isso recorremos a headers.

O header é um componente da mensagem http que possui os parâmetros que definem essa transacção, esta informação não é visível numa página mas contém informação útil para o browser saber como interpretar a mensagem. Por exemplo o título que aparece no browser quando abrimos uma página é fornecido através do header.

Mas como manipulamos o header em imagens? Esta era uma pergunta complicada caso não tivéssemos a simplicidade e flexibilidade do PHP ao dispôr.

A ideia é a seguinte: vamos utilizar um ficheiro PHP para incorporar a imagem, no fundo este ficheiro PHP vai ser a nossa imagem.

Criei um ficheiro index.php numa pasta juntamente com o logótipo do pplware, se abrir a imagem através do browser ela naturalmente aparece

Para tornar o nosso index.php uma “imagem” precisamos de duas coisas, temos de dizer ao browser que o que vai ler é uma imagem e de seguida dar-lhe o código da mesma.

Podemos dizer-lhe que o conteúdo é uma imagem através da função header:

void header ( string $string [, bool $replace = true [, int $http_response_code ]] )

header() é usado para adicionar mais uma linha ao header http.

Para ler e apresentar o código da imagem recorremos à função readfile:

int readfile ( string $nomedoarquivo [, bool $use_include_path [, resource $context ]] )

Lê um arquivo e escreve o seu conteúdo para o buffer de saída (output buffer). 

Vamos então escrever o seguinte código no ficheiro index.php.


E como esperado, se abrirmos a página vamos ver a imagem

O nosso “index.php” é, para o browser, uma imagem igual ao “logo_pplware.png”, este é um bom método para esconder o URL das imagens, e é também baseado neste método que a maior parte dos sites de downloads escondem o endereço real dos ficheiros, mas isto já poderia ser tema para um próximo artigo.

Nesta fase temos já a imagem a ser aberta através de um ficheiro PHP falta agora enviar mais um header que informe o browser para não interpretar directamente a imagem. Para isso basta adicionar mais uma linha ao nosso código.

header('Content-Disposition: attachment; filename=logo.png');

E aqui fica o código completo e devidamente comentado:


Resta testar e comprovar que a imagem já não é apresentada no browser e é enviada para a barra de downloads.

É igualmente possível apresentar outros tipos de ficheiro através de um ficheiro PHP, bastando alterar o campo “Content-type” do header:

"pdf": "application/pdf"
"exe": "application/octet-stream"
"zip": "application/zip"
"xls": "application/vnd.ms-excel"
"ppt": "application/vnd.ms-powerpoint"
"gif": "image/gif"
"png": "image/png"
"jpg": "image/jpg"
"mp3": "audio/mpeg"
"mp3": "audio/mp3"
"wav": "audio/x-wav"
"mpe": "video/mpeg"
"mov": "video/quicktime"
"avi": "video/x-msvideo"  

Além disso existem muitos mais campos de header que podem ser manipulados de forma a obter do browser um tratamento mais apropriado a cada tarefa específica.

Nos próximos artigos vou explicar como é possível tirar partido do header para outras finalidades e como possibilitar o download de um ficheiro durante apenas uns minutos, ao estilo dos sites de download.

Exit mobile version