Opções De Conteúdo Disposição Binária
Última atualização: 12 de fevereiro de 2013 Conteúdo-Disposição cabeçalho - forçando SaveAs nos navegadores Existem situações (para salvar uma documentação em formato pdf ou um documento financeiro) onde você pode querer um hiperlink que leve a um arquivo para apresentar uma caixa de diálogo SaveAs no navegador. Formas de fazer isso existem. No entanto, o suporte flocante do navegador faz com que seu uso seja uma caminhada no campo da mina. Forçando o SaveAs usando javascript no Internet Explorer Por meio de javascript, você pode fornecer uma caixa de diálogo para salvar a página que está atualmente exibida (se o usuário estiver navegando no Internet Explorer na sua página). Isso é feito através do seguinte código: Salvar este pagelt a No entanto, geralmente você deseja salvar outro arquivo, o arquivo ao qual um hiperlink leva. Para fazer isso, o javascript não é suficiente (pelo menos não existe uma maneira padrão) e algo deve ser feito no servidor. Forçando o SaveAs usando o cabeçalho HTTP Para forçar o navegador a exibir a caixa de diálogo SaveAs ao clicar em um hiperlink, você deve incluir o seguinte cabeçalho na resposta HTTP do arquivo a ser baixado: Conteúdo-Disposição: anexo nome do arquivo filenameltflexão onde o nome do arquivo lt. Extgt é o nome do arquivo que deseja exibir na caixa de diálogo SaveAs (como finance. xls ou mortgage. pdf) - sem símbolos lt e gt. Você deve ter em mente o seguinte: O nome do arquivo deve estar no charset US-ASCII e não deve conter caracteres especiais: lt gt. . espaço. O nome do arquivo não deve ter nenhuma informação do caminho do diretório especificada. O nome do arquivo deve ser incluído entre aspas duplas, mas a maioria dos navegadores suportará nomes de arquivos sem aspas duplas. Os navegadores antigos também exigiram o seguinte (não é necessário hoje em dia, mas para uma solução à prova de engano pode valer a pena fazer): o cabeçalho Content-Type deve ser antes de Content-Disposition. O cabeçalho Content-Type deve referir-se a um tipo MIME desconhecido (pelo menos até que os navegadores mais antigos se afastem). Uso detalhado howto Suporte de disposição de conteúdo no Internet Explorer Parece que o Internet Explorer possui o pior histórico do suporte de cabeçalho Content-Disposition. O recurso tinha muitas vulnerabilidades de segurança e, como resultado, a Microsoft mudou o código muitas vezes, por vezes, quebrando completamente. A prática mostrou que o código de download usa um analisador de cabeçalho de HTTP diferente. E se esse analisador não tiver êxito ao lidar com todas as linhas de cabeçalho, o IE não conseguirá baixar o arquivo. Internet Explorer 9.0 Dependendo da versão WinInet. dll pode falhar ao baixar o arquivo com o nome do arquivo contendo os seguintes caracteres especiais: lt gt. . espaço. Artigos Microsoft Knowledgebase: 949197 Descrição do cabeçalho do vazio (string string, bool replace true, int httpresponsecode) () é usado para enviar um cabeçalho HTTP bruto. Consulte a especificação raquo HTTP 1.1 para obter mais informações sobre cabeçalhos HTTP. Lembre-se de que o cabeçalho () deve ser chamado antes de qualquer saída real ser enviada, seja por tags HTML normais, linhas em branco em um arquivo, ou no PHP. É um erro muito comum para ler o código com incluir. Ou exigem. Funções ou outra função de acesso ao arquivo, e tem espaços ou linhas vazias que são emitidas antes do cabeçalho () ser chamado. O mesmo problema existe ao usar um único arquivo HTML do PHP. Lthtmlgt ltphp Isso dará um erro. Observe a saída acima, que é antes do cabeçalho () cabeçalho de chamada (Local: exemplo) sair gt Parâmetros A seqüência de cabeçalho. Existem duas chamadas de cabeçalho de casos especiais. O primeiro é um cabeçalho que começa com a string quot HTTP quot (caso não é significativo), que será usado para descobrir o código de status HTTP para enviar. Por exemplo, se você configurou o Apache para usar um script PHP para lidar com solicitações de arquivos ausentes (usando a diretiva ErrorDocument), você pode querer garantir que seu script gere o código de status apropriado. Cabeçalho ltphp (HTTP 1.0 404 Not Found) gt O segundo caso especial é o quotLocation: quot header. Não só envia este cabeçalho de volta para o navegador, mas também retorna um código de status REDIRECT (302) para o navegador, a menos que o código de status 201 ou a 3xx já tenha sido definido. Cabeçalho ltphp (Local: exemplo) Navegador de redirecionamento Certifique-se de que o código abaixo não seja executado quando redirecionamos. Saída gt O parâmetro de substituição opcional indica se o cabeçalho deve substituir um cabeçalho similar anterior ou adicionar um segundo cabeçalho do mesmo tipo. Por padrão, ele irá substituir, mas se você passar FALSE como o segundo argumento, você pode forçar vários cabeçalhos do mesmo tipo. Por exemplo: cabeçalho ltphp (WWW-Authenticate: Negotiate) cabeçalho (WWW-Authenticate: NTLM. False) gt Força o código de resposta HTTP ao valor especificado. Observe que esse parâmetro só tem efeito se a string não estiver vazia. É importante notar que os cabeçalhos são realmente enviados quando o primeiro byte é exibido no navegador. Se você estiver substituindo cabeçalhos em seus scripts, isso significa que a colocação de instruções de impressão de eco e buffers de saída pode realmente afetar quais cabeçalhos são enviados. No caso de redirecionamentos, se você esquecer de encerrar seu script depois de enviar o cabeçalho, adicionar um buffer ou enviar um caractere pode mudar a página a que seus usuários são enviados. Isso redireciona para 2.html uma vez que o segundo cabeçalho substitui o primeiro. Cabeçalho ltphp (localização: 1.html) cabeçalho (localização: 2.html) substitui 1.html gt Este redireciona para 1.html desde que o cabeçalho é enviado assim que ocorre o eco. Você também não verá nenhum cabeçalho já enviou erros porque o navegador segue o redirecionamento antes que ele possa exibir o erro. Cabeçalho ltphp (localização: 1.html) echo enviar cabeçalho de dados (localização: 2.html) 1.html já enviado gt Envio do exemplo anterior em um buffer de saída realmente altera o comportamento do script Isso ocorre porque os cabeçalhos não são enviados até a saída O buffer é lavado. Ltphp obstart () cabeçalho (localização: 1.html) echo enviar cabeçalho de dados (localização: 2.html) substitui 1.html obendflush () agora os cabeçalhos são enviados gt De acordo com o RFC 6226 (tools. ietf. org html rfc6266) , A única maneira de enviar cabeçalho de disposição de conteúdo com codificação é: Conteúdo-Disposição: nome de arquivo de anexo UTF-8e282ac20rates para compatibilidade com versões anteriores, o que deve ser enviado é: Conteúdo-Disposição: nome do arquivo de anexos taxas de ARO filenameutf-8e282ac20rates Como resultado, devemos usar Ltphp filename. exe um nome de arquivo em caracteres chineses contentDispositionField Content-Disposition: attachment. Sprintf (nomes de arquivos. Rawurlencode (filename)). Sprintf (filenameutf-8s. Rawurlencode (filename)) cabeçalho (Content-Type: application octet-stream) readfile (filetodownload. exe) gt Testai o código no IE6-10, no Firefox e no Chrome. Meus arquivos estão em um estado comprimido (bz2). Quando o usuário clicar no link, eu quero que eles obtenham a versão descompactada do arquivo. Depois de descomprimir o arquivo, encontrei o problema, que a caixa de diálogo de download sempre apareceria, mesmo quando eu disse a caixa de diálogo para sempre executar esta operação com esse tipo de arquivo. Como descobri, o problema estava na diretiva de cabeçalho Content-Disposition, a saber, a diretiva de anexo. Se você deseja que o seu navegador simule um link simples para um arquivo, mude o anexo para inline ou o oponha em conjunto e você estará bem. Isso me demorou um pouco para descobrir e espero que ajude alguém lá fora, que enfrenta o mesmo problema. Uma chamada para sessionwriteclose () antes do cabeçalho ltphp da declaração (Localização: URL) exit () gt é recomendado se você quiser ter certeza de que a sessão está atualizada antes de prosseguir para o redirecionamento. Encontramos uma situação em que o script acessado pelo redirecionamento não estava carregando a sessão corretamente porque o script precedente não tinha tempo para atualizá-lo (usamos um manipulador de banco de dados). Para arquivos grandes (100 MBs), descobri que é essencial descarregar o conteúdo do arquivo o mais rápido possível, caso contrário o diálogo de download não mostra até muito tempo ou nunca. Cabeçalho ltphp (Conteúdo-Disposição: nome do arquivo anexado. Urlencode (arquivo)) cabeçalho (Conteúdo-Tipo: aplicação vigor-download) cabeçalho (Content-Type: aplicação octet-stream) cabeçalho (Content-Type: download do aplicativo) cabeçalho (Content - Descrição: Transferência de arquivo) cabeçalho (Conteúdo-Comprimento:. Filesize (arquivo)) flush () isso realmente não importa. Fp fopen (arquivo r) enquanto (feof (fp)) eco fread (fp. 65536) flush () isso é essencial para grandes downloads fclose (fp) gt Se você deseja remover um cabeçalho e evitar que seja enviado como parte Da resposta do cabeçalho, apenas forneça nada como o valor do cabeçalho após o nome do cabeçalho. Por exemplo. O PHP, por padrão, sempre retorna o seguinte cabeçalho: Qual sua resposta de cabeçalho inteira parecerá HTTP 1.1 200 OK Servidor: Apache 2.2.11 (Unix) X-Powered-By: PHP 5.2.8 Data: sex, 16 de outubro de 2009 23 : 05: 07 GMT Tipo de Conteúdo: texto html charsetUTF-8 Conexão: fechar Se você chamar o nome do cabeçalho sem valor, então. Os seus cabeçalhos agora se parecem com isto: HTTP 1.1 200 OK Servidor: Apache 2.2.11 (Unix) X-Powered-By: PHP 5.2.8 Data: Sex, 16 Oct 2009 23:05:07 GMT Conexão: fechar Depois de muita pesquisa E testes, eu gosto de compartilhar minhas descobertas sobre meus problemas com o Internet Explorer e downloads de arquivos. Dê uma olhada neste código, que replica o download normal de um Javascript: ltphp se (strstr (SERVER HTTPUSERAGENT, MSIE) falso) cabeçalho (Content-type: text javascript) cabeçalho (Content-Disposition: inline filenamedownload. js) cabeçalho ( Cabeçalho do Content-Length:. Filesize (my-file. js)) else header (Content-type: application force-download) (Content-Disposition: attachment filenamedownload. js) (Content-Length:. Filesize (my-file. Js)) (Expira: sex, 01 jan 2010 05:00:00 GMT) se (strstr (SERVER HTTPUSERAGENT, MSIE) falso) cabeçalho (Cache-Control: no-cache) cabeçalho (Pragma: no-cache) incluir ( My-file. js) gt Agora deixe-me explicar: Começo por verificar o IE, então, se não o IE, eu configurei o tipo de conteúdo (sensível a maiúsculas e minúsculas) para JS e configure Content-Disposition (cada cabeçalho diferencia maiúsculas de minúsculas de Agora) para inline, porque a maioria dos navegadores fora do IE gosta de exibir JS inline. (O usuário pode alterar as configurações). O cabeçalho Content-Length é requerido por alguns navegadores para ativar a caixa de download. Então, se for o IE, a aplicação force-download Content-type às vezes é necessária para mostrar a caixa de download. Use isso se você não deseja que o seu PDF seja exibido no navegador (no IE). Eu uso isso aqui para garantir que a caixa seja aberta. De qualquer forma, eu configurei a Disposição de Conteúdo no anexo porque eu já sei que a caixa aparecerá. Então eu tenho o Content-Length novamente. Agora, meu ponto principal. Tenho os cabeçalhos Cache-Control e Pragma enviados apenas se não o IE. ESTES HEADERS EVITARÃO DOWNLOAD NO IE. Utilize apenas o cabeçalho Expira, afinal, exigirá que o arquivo seja baixado novamente na próxima vez. Este não é um bug, o IE armazena downloads na pasta Temporary Internet Files até o download estar completo. Eu sei disso porque, uma vez que eu baixei um arquivo enorme para Meus Documentos, mas a caixa de diálogo Download colocá-lo na pasta Temp e movi-lo no final. Basta pensar nisso. Se o IE exigir que o arquivo seja baixado para a pasta Temp, a configuração dos cabeçalhos Cache-Control e Pragma causará um erro. Espero que isso guarde algum tempo. O pedaço de código no manual que é o seguinte lthtmlgt ltphp Isso irá dar um erro . Observe a saída acima, que é antes do cabeçalho () cabeçalho de chamada (Local: exemplo) sair gt isso não lançará um aviso, pois as configurações. ini para buffer de saída são padrão. Para obter o erro que você pode ter para alterar a configuração do servidor ou simplesmente adicionar uma linha explicitamente para fechar o buffer de saída usando obendclean () ou similar. Isso é o cabeçalho para forçar um navegador a usar conteúdo novo (sem cache) em HTTP 1.0 e HTTP 1.1: cabeçalho ltPHP (expira: sáb, 26 jul 1997 05:00:00 GMT) cabeçalho (Last-Modified :. gmdate (D, d MYH: i: s). GMT) cabeçalho (Cache-Control: no-store, No-cache, must-revalidate) cabeçalho (Cache-Control: post-check0, pré-check0. False) (Pragma: no-cache) Comportamentos de códigos de resposta ao usar o cabeçalho (Local: target. php. Código verdadeiro) para Encaminhar usuário para outra página: código 301 Use quando a página antiga foi movida permanentemente e quaisquer solicitações futuras devem ser enviadas para a página de destino. O PageRank pode ser transferido. Código 302 (padrão) Redirecionamento temporário para que a página seja armazenada em cache apenas se for indicada por um campo de cabeçalho de Cache-Control ou Expirar. Código 303 Este método existe principalmente para permitir a saída de um script ativado por POST para redirecionar o agente do usuário para um recurso selecionado. O novo URI não é uma referência de substituição para o recurso originalmente solicitado e não é armazenado em cache. Código 307 Tenha cuidado de que quando usado após um formulário é enviado usando POST, ele carregaria os valores postados para a próxima página, como se target. php contenha um script de processamento de formulário, ele irá processar as informações enviadas novamente. Em outras palavras, use 301 Se permanente, 302 se temporário e 303 se uma página de resultados de um formulário enviado. Talvez use 307 se um script de processamento de formulário se moveu. Você pode usar etags de HTTPs e datas de última modificação para garantir que você não esteja enviando os dados do navegador que já armazenou em cache. Ltphp lastmodifiedtime filemtime (arquivo) etag md5file (arquivo) cabeçalho (Last-Modified :. gmdate (D, d MYH: i: s. Lastmodifiedtime). GMT) cabeçalho (Etag: etag) se (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime trim ( SERVER HTTPIFNONEMATCH) etag) cabeçalho (HTTP 1.1 304 Not Modified) sair gt Eu só quero adicionar, porque vejo aqui muitos cabeçalhos formatados incorretos. 1. Todos os cabeçalhos usados têm letras maiúsculas, então você DEVE seguir isso. Por exemplo: Localização, não localização Tipo de Conteúdo, não tipo de conteúdo, nem TIPO DE CONTEÚDO 2. Então, DEVE ser cólon e espaço, como bom: cabeçalho (Tipo de Conteúdo: texto planície) incorreto: cabeçalho (Tipo de Conteúdo: Texto simples) 3. Cabeçalho de localização DEVE ser uri absoluto com esquema, domínio, porta, caminho, etc. 4. URIs relativos não são permitidos incorretos: Local: something. phpa1 incorreto: Localização. A1 Isso tornará o servidor proxy e os clientes http mais felizes. EVITE ZERO BYTE ORDER MARK O cabeçalho DEVE ser enviado antes de tudo na página. Mesmo um único espaço quebrará seu script. No meu caso, havia BOM configurada na codificação, então eu abri o arquivo com bloco de anotações e configurei a codificação para UTF-8 (sem BOM) e voila, tudo está funcionando muito bem agora. Aqui está um script php que escrevi para transmitir um arquivo e criá-lo com uma operação xor nos bytes e com uma chave. A encriptação funciona muito bem, mas a velocidade diminui em 2, agora é 520KiB s. O usuário agora está convidado para uma senha md5 (em vez de mantê-la no código diretamente). Há alguma parte em francês porque é minha língua nativa, então modifique-a como você deseja. Ltphp Transfira arquivos e criptografe os dados em turno Configurações - Arquivo para transmitir o arquivo FILEout - Leitura buffer bufferlength 3840 - Chave no hex keychar 9cdfb439c7876e703e307864c9167a15 Função: Conversão hexadecimal em uma string na função binária hex2bin (h) se ( (H)) return null r array () para (a 0 (a 2) lt strlen (h) a) ta hexdec (h 2 a) tb hexdec (h (2 a 1)) ra (int) ((ta Ltlt 4) tb) return r Função para enviar a função de cabeçalho de autenticação askPassword (texto Digite a senha) cabeçalho (WWW-Authenticate: reino básico. Utf8decode (texto).) Cabeçalho (HTTP 1.0 401 Não autorizado) return 1 A chave é solicitada no Primeiro começo se (isset (SERVER PHPAUTHPW)) perguntePassword () echo Une cl is ncessaire ltbr gt exit Obter a chave no hex keychar SERVER PHPAUTHPW Converter a chave e definir o tamanho da chave chave hex2bin (keychar) contagem da chave (comprimento) Teste si The cl est valide en hex se (chave keylength lt 4) askP Assalto (Cl incorrecte) echo Cl incorrecte ltbr gt exit () Teste se o nível de comprimento dune potência de 2 se ((keylength 2) 0) askPassword (Cl. De comprimento incorreto (multiple de 2 uniquement)) Echo Cl de longueur incorrecte (Cabeçalho dos cabeçalhos) (cabeçalho dos cabeçalhos) (Content-Type: aplicação octet-stream) cabeçalho (Content-Transfer-Encoding: binário) cabeçalho (Content-Length:. Arquivo de arquivo (arquivo). ) Cabeçalho (nome do arquivo. Arquivo.) Flush () isso realmente não importa. Abrindo o arquivo em somente fp fopen (arquivo. R) enquanto (feof (fp)) Leia um tamanho de buffer do arquivo buffer fread (fp. Bufferlength) j 0 para (i 0 i lt bufferlength i) A chave é lida Em loop para criptografar o arquivo inteiro se (i keylength 0) j 0 Aplicar uma operação xor entre a chave e o arquivo para a cripta Esta operação leva um monte de tempo de CPU (Stream em 1MiB s no meu servidor Intel E2180) tmp pack (C. key j) bufferE (buffer i tmp) lt Le fameux XOR Enviar os dados criptografados echo bufferE Limpar a memória bufferE j buffer flush () isso é essencial para grandes downloads fclose (fp) exit () Feche o arquivo e o seu acabado fclose ( Fp) A codificação de um arquivo é descoberta pelo Content-Type, na meta tag HTML ou como parte do cabeçalho HTTP. Assim, o servidor e o navegador não precisam - nem esperam - um arquivo Unicode para começar com uma marca de lista técnica. BOMs podem confundir sistemas nix também. Mais informações em unicode. org faq utfbom. htmlbom1 Em outra nota: o Safari pode exibir imagens CMYK (pelo menos, a versão do OS X, porque ela usa os serviços do QuickTime)
Comments
Post a Comment