(Para salvar uma documentação em formato pdf ou um documento financeiro) onde você pode querer um hiperlink que leva a um arquivo para apresentar uma caixa de diálogo SaveAs no navegador. Maneiras de fazer isso existem. No entanto, o apoio escamoso do navegador torna seu uso um passeio no campo de minas. Forçando SaveAs usando javascript no Internet Explorer Por meio de javascript você pode fornecer uma caixa de diálogo para salvar a página que é exibida no momento (se o usuário está olhando através do Internet Explorer em sua página que é). Isso é feito através do seguinte código: Salvar este pagelta No entanto, geralmente você deseja salvar outro arquivo, o arquivo de um hiperlink leva a. Para fazer isso javascript não é suficiente (pelo menos não há tal maneira padrão) e algo deve ser feito no servidor. Forçar SaveAs usando o cabeçalho HTTP Para forçar o navegador a mostrar a caixa de diálogo SaveAs ao clicar em uma hiperligação, tem de incluir o seguinte cabeçalho na resposta HTTP do ficheiro a transferir: Content-Disposition: anexo filenameltfile name. extgt Onde ltfile nome. Extgt é o nome do arquivo que você deseja que apareça na caixa de diálogo SaveAs (como finances. xls ou mortgage. pdf) - sem símbolos lt e gt. Você deve ter em mente o seguinte: O nome do arquivo deve estar em US-ASCII charset e shouldnt conter caracteres especiais: lt gt. . espaço. O nome do arquivo não deve ter nenhuma informação de caminho de diretório especificada. O nome do arquivo deve ser colocado entre aspas, mas a maioria dos navegadores suporta nomes de arquivo 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 tolo pode valer a pena fazer): Content-Type cabeçalho deve ser antes Content-Disposition. O cabeçalho Content-Type deve se referir a um tipo MIME desconhecido (pelo menos até que os navegadores mais antigos desapareçam). Uso detalhado como suporte à Content-Disposition no Internet Explorer Parece que o Internet Explorer tem o pior histórico do suporte ao cabeçalho Content-Disposition. O recurso tinha muitas vulnerabilidades de segurança e, como resultado, a Microsoft alterou o código muitas vezes, por vezes, quebrando-o completamente. A prática tem mostrado que o código de download usa um analisador de cabeçalho HTTP diferente. E se esse analisador não tiver êxito no tratamento de todas as linhas de cabeçalho, o IE falhará ao fazer o download do arquivo. Internet Explorer 9.0 Dependendo da versão WinInet. dll pode falhar ao fazer o download do arquivo com nome de arquivo contendo os seguintes caracteres especiais: lt gt. . espaço. Artigos da Base de Dados de Conhecimento da Microsoft: 949197Crie um anexo Valor de cabeçalho de Content-Disposition usando o nome de arquivo fornecido, se fornecido. O nome do arquivo é opcional e se nenhum nome de arquivo é desejado, mas você deseja especificar opções. Defina filename como indefinido. Note Os cabeçalhos HTTP são do conjunto de caracteres ISO-8859-1. Se você estiver escrevendo este cabeçalho através de um meio diferente de setHeader em Node. js, você quer especificar a codificação binária em Node. js. ContentDisposition aceita essas propriedades no objeto de opções. Se a opção de nome de arquivo estiver fora do ISO-8859-1, o nome do arquivo será armazenado em um campo suplementar para clientes que suportam nomes de arquivo Unicode e uma versão ISO-8859-1 do nome do arquivo é gerada automaticamente. Isso especifica o nome do arquivo ISO-8859-1 para substituir a geração automática ou desabilita a geração em conjunto, o padrão é true. Uma string especificará o nome do arquivo ISO-8859-1 a ser usado no lugar da geração automática. False irá desativar incluindo um nome de arquivo ISO-8859-1 e somente incluir a versão Unicode (a menos que o nome do arquivo já seja ISO-8859-1). True permitirá a geração automática se o nome do arquivo estiver fora da norma ISO-8859-1. Se a opção de nome de arquivo for ISO-8859-1 e essa opção for especificada e tiver um valor diferente, a opção filename será codificada no campo estendido e este será definido como o campo de retorno, mesmo que ambos sejam ISO-8859-1. Especifica o tipo de disposição, padrão para o anexo. Isso também pode ser inline. Ou qualquer outro valor (todos os valores, exceto inline, são tratados como anexo, mas podem transmitir informações adicionais se ambas as partes concordarem com ela). O tipo é normalizado para minúsculas. Analisar uma seqüência de cabeçalho Content-Disposition. Isso controla automaticamente os parâmetros estendidos (Unicode), descodificando-os e fornecendo-os com o nome do parâmetro padrão. Isso retornará um objeto com as seguintes propriedades (exemplos são mostrados para o nome do arquivo de anexo da cadeia de caracteresEURO rates. txt filenameUTF-8e282ac20rates. txt): type. O tipo de disposição (sempre minúsculas). Exemplo: parâmetros de anexo. Um objeto dos parâmetros na disposição (nome do parâmetro sempre minúsculas e versões estendidas substituem versões não-estendidas). Exemplo: Enviar um arquivo para downloadDescription void header (string string, bool replace true, int httpresponsecode) header () é usado para enviar um cabeçalho HTTP bruto. Consulte a especificação raquo HTTP1.1 para obter mais informações sobre cabeçalhos HTTP. Lembre-se de que header () deve ser chamado antes que qualquer saída real seja enviada, seja por tags HTML normais, linhas em branco em um arquivo ou por PHP. É um erro muito comum ler código com include. Ou exigir. Funções ou outra função de acesso a ficheiros, e têm espaços ou linhas vazias que são de saída antes de cabeçalho () é chamado. O mesmo problema existe ao usar um único arquivo PHPHTML. Lthtmlgt ltphp Isso dará um erro. Observe a saída acima, que é antes do cabeçalho de chamada de cabeçalho () (Local: exemplo) exit gt Parâmetros A seqüência de cabeçalho. Há duas chamadas de cabeçalho de caso especial. O primeiro é um cabeçalho que começa com a seqüência de caracteres quot HTTP (caso não é significativo), que será usado para descobrir o código de status HTTP para enviar. Por exemplo, se você tiver configurado o Apache para usar um script PHP para lidar com pedidos de arquivos ausentes (usando a diretiva ErrorDocument), você pode querer certificar-se de que seu script gera o código de status apropriado. Ltphp header (HTTP1.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 3xx já tenha sido definido. Ltphp header (Location: example) Redirecionar o navegador Certifique-se de que o código abaixo não é executado quando redirecionamos. Exit gt O parâmetro opcional replace 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 em 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 para o valor especificado. Observe que esse parâmetro só tem um efeito se a seqüência de caracteres não estiver vazia. É importante observar que os cabeçalhos são realmente enviados quando o primeiro byte é enviado para o navegador. Se você estiver substituindo cabeçalhos em seus scripts, isso significa que a colocação de instruções echoprint e buffers de saída pode realmente impactar quais cabeçalhos são enviados. No caso de redirecionamentos, se você esquecer de encerrar o script depois de enviar o cabeçalho, adicionar um buffer ou enviar um caractere pode alterar a página para a qual seus usuários são enviados. Isso redireciona para 2.html desde o segundo cabeçalho substitui o primeiro. Cabeçalho ltphp (local: 1.html) cabeçalho (local: 2.html) substitui 1.html gt Isso redireciona para 1.html desde o cabeçalho é enviado assim que o eco acontece. Você também não verá quaisquer cabeçalhos já enviados erros porque o navegador segue o redirecionamento antes que ele possa exibir o erro. Ltphp cabeçalho (localização: 1.html) echo enviar dados cabeçalho (local: 2.html) 1.html já enviada gt Wrapping o exemplo anterior em um buffer de saída realmente muda o comportamento do script Isso é porque os cabeçalhos arent enviados até a saída Tampão é lavado. Ltphp obstart () cabeçalho (localização: 1.html) echo enviar dados cabeçalho (local: 2.html) substitui 1.html obendflush () agora os cabeçalhos são enviados gt Meus arquivos estão em um estado compactado (bz2). Quando o usuário clica no link, eu quero que eles para obter a versão descompactada do arquivo. Depois de descompactar o arquivo, eu corri para o problema, que a caixa de diálogo de download seria sempre pop-up, mesmo quando eu disse a caixa de diálogo para sempre executar esta operação com este tipo de arquivo. Como eu descobri, o problema estava na diretiva de cabeçalho Content-Disposition, ou seja, a diretiva de anexos. Se você quiser que seu navegador simule um link simples para um arquivo, altere o anexo para inline ou omita tudo e você estará bem. Isso me levou um tempo para descobrir e espero que ele vai ajudar alguém lá fora, que corre para o mesmo problema. Salvando arquivo php no ANSI não isuess mas ao salvar o arquivo no formato UTF-8 por várias razões lembre-se de salvar o arquivo sem qualquer suporte BOM (byte-order mark). Caso contrário, você vai enfrentar o problema de cabeçalhos não sendo devidamente enviados, por exemplo. Ltphp cabeçalho (Set-Cookie: nameuser) gt Daria algo como isto: - Aviso: Não é possível modificar informações de cabeçalho - cabeçalhos já enviados por (saída iniciada em C: wwwinfo. php: 1) em C: wwwinfo. php on line 1 Para o RFC 6226 (tools. ietf. orghtmlrfc6266), a única maneira de enviar Content-Disposition Header com codificação é: Content-Disposition: anexo nome do arquivo UTF-8e282ac20rates para compatibilidade com versões anteriores, o que deve ser enviado é: Content-Disposition: anexo filenameEURO Rates 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: applicationoctet-stream) readfile (filetodownload. exe) gt Eu testei o código no IE6-10, firefox e Chrome. Para arquivos grandes (100 MB), descobri que é essencial para limpar o conteúdo do arquivo o mais rápido possível, caso contrário, o diálogo de download não mostrará até muito tempo ou nunca. Cabeçalho (Content-Type: applicationoctet-stream) cabeçalho (Content-Type: applicationdownload) cabeçalho (Conteúdo-Descrição: Arquivo Transferir) cabeçalho (Content-Length:. Filesize (arquivo)) flush () isso realmente não importa. Fp fopen (arquivo. R) while (feof (fp)) echo fread (fp. 65536) flush () isso é essencial para grandes downloads fclose (fp) gt Se você não tem usado, HTTP Response 204 pode ser muito conveniente. 204 diz ao servidor para termiante imediato este pedido. Isso é útil se você deseja que uma função do lado do cliente javascript (ou similar) execute uma função do lado do servidor sem atualizar ou alterar a página da Web atual. (HTTP1.0 204 Sem resposta) Uma chamada para sessionwriteclose () antes da instrução ltphp header (Location: URL) exit ( ) Gt é recomendado se você quiser ter certeza de que a sessão é atualizada antes de prosseguir para o redirecionamento. Encontramos uma situação em que o script acessado pelo redirecionamento wasnt carregar a sessão corretamente porque o script precedente hadnt o tempo para atualizá-lo (usamos um manipulador de banco de dados). Apenas para informar a todos, não se confunda entre Content-Transfer-Encoding e Content-Encoding Content-Transfer-Encoding especifica a codificação usada para transferir os dados dentro do protocolo HTTP, como raw binary ou base64. (Binário é mais compacto que base64. Base64 tendo 33 sobrecarga). Por exemplo, Use: - header (Content-Transfer-Encoding: binário) Content-Encoding é usado para aplicar coisas como compressão gzip para o contentdata. Por exemplo, Use: - header (Content-Encoding: gzip) Você pode usar etags HTTPs e datas da última modificação para garantir que você não esteja enviando os dados do navegador que já tenha armazenado em cache. Ltphp lastmodifiedtime filemtime (arquivo) etag md5file (arquivo) cabeçalho (Última modificação: gmdate (D, d MYH: i: s. Lastmodifiedtime). GMT) cabeçalho (Etag: etag) if (strtotime (SERVER HTTPIFMODIFIEDSINCE) lastmodifiedtime trim SERVER HTTPIFNONEMATCH) etag) header (HTTP1.1 304 não modificado) exit gt Se você quiser remover um cabeçalho e mantê-lo de ser enviado como parte da resposta de cabeçalho, basta fornecer nada como o valor do cabeçalho após o nome do cabeçalho. Por exemplo. PHP, por padrão, sempre retorna o seguinte cabeçalho: Qual sua resposta de cabeçalho inteira será parecido com HTTP1.1 200 OK Servidor: Apache2.2.11 (Unix) X-Powered-Por: PHP5.2.8 Data: Fri, 16 Out 2009 23: 05:07 GMT Tipo de conteúdo: texthtml charsetUTF-8 Conexão: close Se você chamar o nome do cabeçalho sem nenhum valor assim. Seus cabeçalhos agora ficam assim: HTTP1.1 200 OK Servidor: Apache2.2.11 (Unix) X-Powered-Por: PHP5.2.8 Data: Sex, 16 Out 2009 23:05:07 GMT Conexão: close Eu só quero adicionar , Porque eu vejo aqui um monte de cabeçalhos formatados errados. 1. Todos os cabeçalhos usados têm letras maiúsculas, então você DEVE seguir isso. Por exemplo: Local, não localização Content-Type, não content-type, nem CONTENT-TYPE 2. Então deve haver dois pontos e espaço, como good: header (Content-Type: textplain) wrong: header (Content-Type: textplain) ) 3. Cabeçalho de localização deve ser absoluto uri com esquema, domínio, porta, caminho, etc 4. Relative URIs NÃO são permitidos errado: Location: something. phpa1 wrong: Location. A1 fará servidor proxy e clientes http mais felizes. Depois de muita pesquisa e testes, gostaria 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 cabeçalho (strstr (SERVER HTTPUSERAGENT, MSIE) false) cabeçalho (Content-type: textjavascript) cabeçalho (Content-Disposition: inline filenamedownload. js) (Content-Disposition: attachment filenamedownload. js) cabeçalho (Conteúdo-Comprimento :. filesize (my-file. js) ) Cabeçalho (Pragma: no-cache) cabeçalho (Cache-Control: no-cache) strstr (SERVER HTTPUSERAGENT, MSIE) cabeçalho (my - File. js) gt Agora deixe-me explicar: Eu começo verificando por IE, então se não IE, eu definir Content-type (case-sensitive) para JS e definir Content-Disposition (cada cabeçalho é caso-sensível a partir de agora ) Para inline, porque a maioria dos navegadores fora do IE gostam de exibir JS inline. (O usuário pode alterar as configurações). O cabeçalho Content-Length é exigido por alguns navegadores para ativar a caixa de download. Em seguida, se for o IE, o applicationforce-download Content-type às vezes é necessário para mostrar a caixa de download. Use isso se você não quiser que seu PDF para exibir no navegador (no IE). Eu usá-lo aqui para certificar-se de que a caixa se abre. Enfim, eu definir o Content-Disposition para anexo porque eu já sei que a caixa irá aparecer. Então eu tenho o Content-Length novamente. Agora, heres meu grande ponto. Eu tenho o Cache-Control e Pragma cabeçalhos enviados apenas se não IE. ESTES HEADERS PREVIRÃO DOWNLOAD NO IE. Use apenas o cabeçalho Expires, afinal, ele 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é que o download seja concluído. Eu sei disso porque uma vez eu baixei um arquivo enorme para Meus Documentos, mas a caixa de diálogo Download colocá-lo na pasta Temp e movido-o no final. Basta pensar nisso. Se o IE exigir que o arquivo seja baixado para a pasta Temp, definir os cabeçalhos Cache-Control e Pragma causará um erro. Espero que isso poupe algum tempo. Aqui está um script PHP que escrevi para transmitir um arquivo e criptografar com uma operação xor Sobre os bytes e com uma chave. A criptografia funciona muito bem, mas a velocidade é diminuída em 2, agora é 520KiBs. O usuário agora é solicitado para uma senha md5 (em vez de mantê-lo no código diretamente). Há alguma parte em francês porque é minha língua nativa assim modificá-lo como você quer. Ltphp Fluxo de arquivos e criptografar os dados on-the-fly Configurações - Arquivo para transmitir arquivo FILEout - buffer de leitura bufferlength 3840 - Chave em hexadecimal chave 9cdfb439c7876e703e307864c9167a15 Função: conversão hexadecimal chave em uma Cadeia de caracteres em binário função hex2bin (h) if ( (H)) n () () () () () () () () () () () Ltlt 4) Retorna r Função para enviar a função de cabeçalhos de autenticação askPassword (texto Digite a senha) cabeçalho (WWW-Authenticate: Basic realm utf8decode (texto).) Header (HTTP1.0 401 Unauthorized) O primeiro arranque se (isset (SERVER PHPAUTHPW)) askPassword () echo Une cl sais ncessaire ltbr gt saída Obter a chave em hex keychar SERVIDOR PHPAUTHPW Converter chave e definir o tamanho da chave hex2bin (keychar) keylength count (key) Teste Si la cl est valide en hex se (chave keylength lt 4) askPassword (Cl incorrecte) Echo Cl incorrecte ltbr gt exit () Teste se o comprimento de uma duna de comprimento de 2 if ((keylength 2) 0) askPassword (Cl de longueur incorrecte) ) Cabeçalho cabeçalhos (Content-Type: applicationoctet-stream) header (Content-Transfer-Encoding: binário) header (Content-Length:. Filesize (arquivo). ) Header (filename. File.) Flush () isso realmente não importa. Abrir o arquivo em fp fopen (arquivo. R) while (feof (fp)) Ler um tamanho de buffer do buffer de arquivo fread (fp bufferlength) j 0 para (i 0 i lt bufferlength i) A chave é lida Em loop para criptar o arquivo inteiro se (i keylength 0) j 0 Aplicar uma operação xor entre a chave eo arquivo para criptar Esta operação come um monte de tempo de CPU (Stream em 1MiBs no meu servidor Intel E2180) tmp pack (C. Chave j) bufferE (buffer i tmp) lt Le fameux XOR Enviar o buffer de eco de dados criptografadosE Limpe o buffer de memóriaE j buffer flush () isso é essencial para grandes downloads fclose (fp) exit () Feche o arquivo e fclose finalizado ) EVITE ZERO BYTE ORDER MARK Cabeçalho deve ser enviado antes de tudo na página. Mesmo um único espaço irá quebrar seu script. No meu caso, havia BOM setted na codificação, então eu abri o arquivo com notepad e definir a codificação para UTF-8 (sem BOM) e voila, tudo está funcionando muito bem agora. Passei muito tempo tentando determinar por que o Internet Explorer 7 não estava solicitando que o usuário salvasse um download com base no nome do arquivo especificado em um Content-Disposition: attachment filename. Linha de cabeçalho. Eu finalmente determinei que minha instalação do Apache estava adicionando um cabeçalho adicional: Vary: Host, que estava jogando IE - como por support. microsoftkb824847 Eu encontrei manualmente definindo o cabeçalho Vary de dentro do PHP como segue cabeçalho (Vary: User-Agent) permitiu IE Comportar-se como pretendido. Espero que isso poupe algum tempo algum, A codificação de um arquivo é descoberta pelo Content-Type, na meta tag HTML ou como parte do cabeçalho HTTP. Assim, o servidor eo navegador não precisa - nem esperar - um arquivo Unicode para começar com uma marca de lista técnica. As listas técnicas podem também confundir os sistemas nix. Mais informações em unicode. orgfaqutfbom. htmlbom1 Em outra nota: o Safari pode exibir imagens CMYK (pelo menos, a versão do OS X, porque usa os serviços do QuickTime) Definir um cabeçalho de localização retorna um código de status REDIRECT (302) ao navegador, a menos que 201 ou um código de estado 3xx já foi definido. Se você estiver enviando uma resposta para uma solicitação POST, você pode querer olhar para RFC 2616 seções 10.3.3 e 10.3.4. Sugere-se que se você quiser que o navegador obtenha o recurso imediatamente no cabeçalho Local nesta circunstância, use um código de status 303 não o 302 (com o mesmo link que o hipertexto no corpo para navegadores muito antigos). Isso pode ter conseqüências (raras) como mencionado no bug 42969.Criar um valor de cabeçalho Content-Disposition de anexo usando o nome de arquivo fornecido, se fornecido. O nome do arquivo é opcional e se nenhum nome de arquivo é desejado, mas você deseja especificar opções. Defina filename como indefinido. Note Os cabeçalhos HTTP são do conjunto de caracteres ISO-8859-1. Se você estiver escrevendo este cabeçalho através de um meio diferente de setHeader em Node. js, você quer especificar a codificação binária em Node. js. ContentDisposition aceita essas propriedades no objeto de opções. Se a opção de nome de arquivo estiver fora do ISO-8859-1, o nome do arquivo será armazenado em um campo suplementar para clientes que suportam nomes de arquivo Unicode e uma versão ISO-8859-1 do nome do arquivo é gerada automaticamente. Isso especifica o nome do arquivo ISO-8859-1 para substituir a geração automática ou desabilita a geração em conjunto, o padrão é true. Uma string especificará o nome do arquivo ISO-8859-1 a ser usado no lugar da geração automática. False irá desativar incluindo um nome de arquivo ISO-8859-1 e somente incluir a versão Unicode (a menos que o nome do arquivo já seja ISO-8859-1). True permitirá a geração automática se o nome do arquivo estiver fora da norma ISO-8859-1. Se a opção de nome de arquivo for ISO-8859-1 e essa opção for especificada e tiver um valor diferente, a opção filename será codificada no campo estendido e este será definido como o campo de retorno, mesmo que ambos sejam ISO-8859-1. Especifica o tipo de disposição, padrão para quotattachmentquot. Isso também pode ser quotinlinequot. Ou qualquer outro valor (todos os valores, exceto inline, são tratados como anexo, mas podem transmitir informações adicionais se ambas as partes concordarem com ela). O tipo é normalizado para minúsculas. Analisar uma seqüência de cabeçalho Content-Disposition. Isso controla automaticamente os parâmetros estendidos (quotUnicodequot) descodificando-os e fornecendo-os com o nome do parâmetro padrão. Isso retornará um objeto com as seguintes propriedades (os exemplos são mostrados para o nome do arquivo de anexo de stringquotEURO rates. txtquot filenameUTF-8e282ac20rates. txt): type. O tipo de disposição (sempre minúsculas). Exemplo: parâmetros de anexo. Um objeto dos parâmetros na disposição (nome do parâmetro sempre minúsculas e versões estendidas substituem versões não-estendidas). Exemplo: Envie um arquivo para download
No comments:
Post a Comment