Tuesday 22 August 2017

Php Mime Type Binary Options


Um tipo MIME para arquivos. php Ao configurar algumas propriedades svn no trabalho, nos perguntamos sobre o tipo MIME correto para arquivos. php. Olhando em torno das várias listas mágicas de detecção de tipo MIME em nossas máquinas unix e na lista oficial do tipo IANA MIME. As opções que surgimos foram: MIME type rulesx200B Como não há nenhum tipo MIME oficial registrado na IANA, apenas um tipo de extensão (x-prefixed) pode ser usado - o que significa que textphp e applicationphp não são adequados: qualquer tipo de arquivo não registrado deve Seja listado com um x - anterior. Como em applicationx-foo (RFC2045 5.1), ou um x. . Como em applicationx. foo (RFC4288 4.3). Qualquer tipo de prefixo não x deve ser registrado na IANA e listado no endereço acima. Qualquer outro comportamento é uma violação de padrões MIME Linux distributionsx200B Banco de dados mágico Ubuntus MIME - usado pelo comando do arquivo - escreve textx-php. Debians mime-support package, também enviado pelo Ubuntu, lista applicationx-httpd-php para. php e applicationx-httpd-php-source para arquivos. phps em etcmime. types. Estes dois tipos são - nos meus olhos - mais para o uso interno do Apachewebserver, uma vez que o PHP não só é utilizável em um daemon HTTP. IANA considerationsx200B O que está à esquerda são textx-php e applicationx-php. Eu pessoalmente prefiro o texto para arquivos de texto simples legíveis pelo usuário, e é por isso que eu estava cético sobre o applicationx-php no início. Então eu vi que em 2006, a IANA oficialmente atribuiu applicationjavascript para arquivos de código JavaScript - e não textjavascript. O RFC afirma: o uso do texto do tipo de nível superior para este tipo de conteúdo é conhecido por ser problemático. - mas não indica o motivo disso. Eu acho que isso ocorre porque surgem problemas de segurança, pois os navegadores tentam exibir todos os tipos de texto MIME como HTML. Um raciocínio semelhante foi usado quando se aplica para o tipo JSON MIME que foi oficialmente atribuído na RFC 4627. Quando perguntado sobre por que não o textjson, Crockford parece ter dito que a JSON não é realmente javascript nem texto e também a IANA era mais provável que entregar o aplicativo do que Texto. Outras línguasx200B Olhando para os tipos de texto oficialmente atribuídos deixa claro que não existe um único tipo de arquivo de idioma na linguagem no clube. (HTML é, como o nome indica, uma marcação e não uma linguagem de programação - e é por isso que texthtml não conta.) A lista de tipos de aplicativos, por outro lado, contém tipos como applicationecmascript e applicationjavascript. Ambas as linguagens de programação. Além disso, mesmo o Debian coloca várias linguagens de programação no grupo de aplicativos: applicationx-ruby. Applicationx-sh e applicationx-tcl. Downsidesx200B Usar applicationx-php como tipo MIME para arquivos. php não está sem dor. Um tipo que começa com texto indica que o conteúdo do arquivo é legível por humanos. Eu posso abri-lo e pegar um aperto do que está acontecendo dentro, mesmo que eu não entenda tudo quando não conheço o idioma específico em que o arquivo está. Eu posso usar utilitários de texto nele: cat. Grep. Sed. Diferente, você o nomeia. Não é mesmo ser eu mesmo que use as ferramentas que pode ser um aplicativo ou um script de shell que escrevi que detecta Estou trabalhando com um arquivo de texto e uso as ferramentas apropriadas. Os arquivos com um tipo que começa com o aplicativo, por outro lado, podem ser confiáveis ​​para serem legíveis somente para máquina. Usar applicationjava-vm para arquivos. class é totalmente bom, já que apenas um computador pode lê-lo - bem como applicationzip e applicationvnd. oasis. opendocument. spreadsheet. Uma ferramenta que falha mal com applicationx-php é o svn acima mencionado. Ele detecta arquivos de texto como eu descrevi, usando a parte de mídia de tipos MIME. Definir o tipo MIME de um arquivo. php para applicationx-php leva ao problema de que ele lida com arquivos PHP como binário, portanto, não os difunde - tornando impossíveis os projetos de PHP em projetos PHP. Tivemos que voltar para o textx-php nos nossos repositórios svn. O mesmo problema surge quando se usa o tipo de aplicativo oficial javascript. O relatório de erro associado sugere colocar uma série de tipos de aplicativos na lista de arquivos de texto. E exatamente esse é o problema: como é que um programador deve detectar se um arquivo é legível por humanos e pode ser exibido. Com o IANA que ditam realidades que derivam em relação aos tipos de aplicativos, o tipo MIME não é mais um indicador. Conclusionx200B A colocação de linguagens de programação no grupo de aplicativos tem significância estatística e também é respaldada por decisões anteriores da IANA. Portanto, parece inevitável usar applicationx-php como tipo MIME para arquivos. php - mas torna a vida de desenvolvedores mais difícil. Estou tentando encontrar o tipo mime de uma imagem. O PHP tem a função getimagesize, mas que só leva um nome de arquivo, enquanto eu tenho um recurso de imagem em vez disso - ou seja, uma imagem criada a partir de imagecreatefromstring. Eu encontrei as funções imagesx e imagesy que retornam a largura de um recurso, mas não consigo encontrar nenhuma função que me diga o tipo mime de um recurso. Alguém sabe de uma maneira de fazer isso. Nota: devido a um servidor de servidor estranho, não podemos reproduzir arquivos do servidor normalmente, apenas através de uma camada FTP (onde é que eu leio os dados da imagem). Solicitado 5 de fevereiro às 12:21 A função imagefiletypefrombinary não é a prova de falhas. Às vezes, um arquivo está sendo carregado, mas o mimetype não é um imagelttypegt. Faça com que o caso do pregmatch seja insensível, adicionando um 39i39 após o final da barra-atrás. (Fez a alteração no script acima, mas tem que aguardar a aprovação) o uso dessa função é bom porque nem todos os webhosts permitem usar extensões fileinfo ou exif. Ndash SomeOne1 2 de janeiro de 12 às 0:44 Claro que não é seguro. Ele só verifica o quotmagic bytesquot no início do imagedata. Anexar uma cotação ao regex é uma ideia bastante ruim. Os arquivos binários não têm idéia de quotcase awarenessquot. Ndash fireweasel 6 de junho 12 às 20:29 Uma imagem criada usando imagecreatefromstring não possui nenhum tipo MIME, é decodificada a partir do formato nativo e armazenada no formato interno do GDs. A mesma pergunta foi solicitada um tempo atrás com o mesmo resultado. O único caminho a percorrer é pegar a imagem antes que ela seja imaginada e, de alguma forma, pegue as informações de tamanho. Você diz que não pode fazer operações de readwrite em seu sistema, então apenas escrever o arquivo está fora de questão. O fato de que getimagesize () não pode ler as variáveis ​​é conhecido e lamentou: bugs. phpbug. phpid44239 O cara que menciona uma solução idêntica: registrando um novo wrapper de fluxo que permite operações de arquivos em variáveis. Esta é uma opção na configuração do servidor respondida 5 de fevereiro 10 às 12:29 Desculpe, como eu disse que não posso reescrever arquivos para o servidor normalmente, então não é possível usar getimagesize porque não há nome de arquivo. EDITAR: cara, não seja tão impaciente, eu estava escrevendo uma explicação. ) Ndash DisgruntledGoat 5 de fevereiro 10 às 12:40 Pode ser feito com um recurso GD apenas, desculpe. Mas se você imaginar uma verdadeira variedade. Você tem os dados originais em algum momento, certo. Por que não gravá-lo no disco e faça um getimagesize. Eu concordo que é bobo, mas isso vai fazer o trabalho. EDIT: é por isso que primeiro comento e depois votei) Segunda edição: Ah, você não pode gravar no disco. E eu aceito que você não pode usar o ftp: 4747 wrapper para imagesize () ndash Pekka 5 de fevereiro 10 às 12:41 FWIW, acabei de encontrar isso também. O PHP 5.3 não está disponível atualmente, portanto, getimagesizefromstring () não é uma opção (nem FileInfo), e eu não queria complicar a implementação com o wrapper VariableStream. A próxima coisa melhor é usar os dados: wrapper 4747, que permite criar um URI em memória que getimagesize () pode ler. Ele também otimiza o pedido codificando apenas uma pequena substring dos dados binários. A essência da implementação está aqui: gist. github3751491 ndash Joe Sep 19 12 em 19: 01mimecontenttype usando ltphp function detectFileMimeType (filename) nome do arquivo escapeshellcmd (filename) arquivo de comando - b --mime-type - m usrsharemiscmagic mimeType shellexec (comando) return Trim (mimeType) gt deve funcionar na maioria dos hosts linux compartilhados sem erros. Ele também deve funcionar em hosts do Windows com o msysgit instalado. Ltphp if (functionexists (mimecontenttype)) função mimecontenttype (filename) txt gt textplain, htm gt texthtml, html gt texthtml, php gt texthtml, css gt textcss, js gt applicationjavascript, json gt applicationjson, xml gt applicationxml, swf gt applicationx-shockwave - flash, flv gt videox-flv, imagens png gt imagepng, jpeg gt imagejpeg, jpeg gt imagejpeg, jpg gt imagejpeg, gif gt imagegif, bmp gt imagebmp, ico gt imagevnd. microsoft. icon, tiff gt imagetiff, tif gt imagetiff, Svg gt imagesvgxml, svgz gt imagesvgxml, arquivos zip gt applicationzip, rar gt applicationx-rar-compressed, exe gt applicationx-msdownload, msi gt applicationx-msdownload, cab gt applicationvnd. ms-cab-compressed, audiovideo mp3 gt audiompeg, qt gt Videoquicktime, mov gt videoquicktime, adobe pdf gt applicationpdf, psd gt imagevnd. adobe. photoshop, ai gt applicationpostscript, eps gt applicationpostscript, ps gt applicationpostscript, ms office doc gt applicationmsword, r Aplicação do aplicativo gt, xls gt applicationvnd. ms-excel, ppt gt applicationvnd. ms-powerpoint, open office odt gt applicationvnd. oasis. opendocument. text, ods gt applicationvnd. oasis. opendocument. spreadsheet,) ext strtolower (arraypop (explodir ( ... nome do arquivo))) se (arraykeyexists (ext. Mimetypes)) return mimetypes ext elseif (functionexists (finfoopen)) finfo finfoopen (FILEINFOMIME) mimetype finfofile (finfo. Filename) finfoclose (finfo) return mimetype else return applicationoctet-stream gt Heres uma função simples para retornar tipos MIME, com base no Apache Arquivo mime. types. Aquele na minha submissão anterior, que desde então foi substituído por este apenas funciona corretamente se mime. types for formatado como texto do Windows. A versão atualizada abaixo corrige esse problema. Obrigado a Mike por apontar isso. Função ltphp getmimetype (nome do arquivo. MimePath ..etc) fileext substr (strrchr (filename ...), 1) se (vazio (fileext)) retornar (falso) regex (w -.) S (ws) (fileext s) i linhas Arquivo (mimePath mime. types) foreach (linhas como linha) se (substr (linha 0. 1)) continue ignore a linha de comentários rtrim (linha). Se (pregmatch (regex. Line. Match)) continuar sem coincidir com o retorno da extensão (fósforos 1) return (false) nenhuma correspondência gt Notas: 1 Requer arquivo mime. types distribuído com o Apache (normalmente encontrado no ServerRootconfmime. types) . Se você estiver usando hospedagem compartilhada, baixe o arquivo com a distro do Apache e depois carregue-o para um diretório no seu servidor web ao qual o php tenha acesso. 2 Primeiro parâmetro é o nome do arquivo (obrigatório). O segundo parâmetro é o caminho para o arquivo mime. types (padrões opcionais para homeetc). 3 Com base em tipos MIME registrados com IANA (iana. orgassignmentsmedia-typesindex. html). Reconhece 630 extensões associadas a 498 tipos MIME. 4 Assinala o tipo MIME com base na extensão do nome do arquivo. Não examina o arquivo real que o arquivo nem precisa existir. 5 Exemplos de uso: gtgt echo getmimetype (myFile. xml) gtgt applicationxml gtgt echo getmimetype (myPathmyFile. js) gtgt applicationjavascript gtgt echo getmimetype (myPresentation. ppt) gtgt applicationvnd. ms-powerpoint gtgt echo getmimetype (mySitemyPage. php) gtgt applicationx - Httpd-php gtgt echo getmimetype (myPicture. jpg) gtgt imagejpeg gtgt echo getmimetype (myMusic. mp3) gtgt audiompeg e assim por diante. Para criar uma matriz associativa contendo tipos MIME, use: ltphp function getmimearray (mimePath ..etc) regex (w -.) T (ws) i arquivo de linhas (mimePath mime. types. FILEIGNORENEWLINES) foreach (linhas como linha) se (substr (Linha 0. 1)) continuar ignorar comentários se (pregmatch (regex. Line. Matches)) continuar ignorar mime types wo any extensions mime matches 1 extensions explodir (. Matches 2) foreach (extensões como ext) mimeArray trim (ext) Mime return (mimeArray) gt Eu vejo muitos comentários sugerindo que o sniffing da extensão do arquivo (ou seja, assumindo que os arquivos. jpg são imagens JPEG) quando as funções adequadas de sniffing do tipo de arquivo não estão disponíveis. Quero salientar que existe uma maneira muito mais precisa. Se nem mimecontenttype () nem Fileinfo estiverem disponíveis para você e você está executando qualquer variante UNIX desde os anos 70, incluindo Mac OS, OS X, Linux, etc. (e a maioria das hospedagens na web é), basta fazer uma chamada de sistema para o arquivo (1 ). Fazendo algo como isto: ltphp echo system (file - bi ltfile pathgt) gt irá gerar algo como texthtml charsetus-ascii. Alguns sistemas não adicionarão o bit do charset, mas eliminá-lo apenas no caso. O bit - bi é importante. No entanto, você pode usar um comando como este: ltphp echo system (arquivo - b ltfile pathgt) sem o i depois de - b gt para produzir uma string legível para humanos, como texto de documento HTML, que às vezes pode ser útil. A única desvantagem é que seus scripts não funcionarão no Windows, mas esse é um problema. Apenas sobre todos os hosts da Web, use um UNIX. É uma maneira muito melhor do que apenas examinar a extensão do arquivo. Aqui está uma versão funcional de uma função que obtém os tipos meme de apaches construídos na lista mime e cria uma matriz das quais as chaves são as extensões de arquivo: function generateUpToDateMimeArray (url) return array () mimes filegetcontents (svn. apache. orgreposasfhttpdhttpdtrunkdocsconfmime. Tipos) certifique-se de que allowurlfopen esteja habilitado pregmatchall ((s) s (.) Ism, mimes, matches, PREGSETORDER) foreach (combina como correspondência) exts split (, match2) foreach (exts as ext) returnextmatch1 return return typeMime generateUpToDateMimeArray () Echo typeMimegif Eu também tive problemas com esta função. A questão era que quase sempre retornaria o texto. Echo iniget (mimemagic. magicfile) retorna etchttpdconfmagic Eu descobri que eu precisava do arquivo Magic. mime do sistema em vez disso. Você pode copiá-lo para o local existente ou atualizar seu php. ini, não pode usar iniset (). Rootblade conf mv magic magic. old rootblade conf cp usrsharemagic. mime magic rootblade conf apachectl gracioso Nota: você verá que eu gere graficamente o apache para garantir que ele tenha afetado. Concluindo ltome dude AT em algum lugar DOT Comgt comentário: 0 string lt. Php applicationx-httpd-php e detecção de string em arquivos de texto podem falhar se você verificar um arquivo codificado com UTF-8 assinado. A assinatura UTF-8 é um código de dois bytes (0xFF 0xFE) que precede o arquivo para forçar o reconhecimento UTF-8 (você pode verificar em um editor hexadecimal). A função mimecontenttype só funcionou para mim no Microsoft Windows depois de adicionar a diretriz mimemagic. debug ao meu php. ini com o valor On. O valor padrão parece estar Desligado. Exampe: mimemagic mimemagic. debug No arquivo mimemagic. magic c: phpextrasmagic. mimeDescription 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 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 PHPHTML. 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 (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 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 echoprint 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 Meus arquivos estão em um estado compactado (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. Salvando o arquivo php em ANSI sem isuess, mas ao salvar o arquivo no formato UTF-8 por vários motivos, lembre-se de salvar o arquivo sem qualquer suporte de lista técnica (marca de ordem de byte). Caso contrário, você enfrentará o problema dos cabeçalhos que não estão sendo devidamente enviados, por exemplo. Cabeçalho ltphp (Set-Cookie: nomeador) gt Daria algo como isto: - Aviso: Não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por (saída iniciada em C: wwwinfo. php: 1) em C: wwwinfo. php na linha 1 De acordo Para o RFC 6226 (tools. ietf. orghtmlrfc6266), a única maneira de enviar o cabeçalho de disposição do conteúdo com codificação é: Conteúdo-Disposição: anexo nome do arquivo UTF-8e282ac20rates para compatibilidade com versões anteriores, o que deve ser enviado é: Conteúdo-Disposição: anexo nome do arquivoEURO Taxas de classificação de arquivos 8e282ac20rates Como resultado, devemos usar o nome do arquivo ltphp. 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 Testei o código no IE6-10, o Firefox e o Chrome. 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 do cabeçalho do ltphp (Conteúdo-Disposição: nome do arquivo anexado. Urlencode (arquivo)) (Content-Type: applicationforce-download) cabeçalho do cabeçalho do cabeçalho (Content-Type: applicationoctet-stream) (Content-Type: applicationdownload) (Content-Description: File Transferir) cabeçalho (Content-Length:. Filesize (file)) 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ê não tiver sido usado, o HTTP Response 204 pode ser muito conveniente. 204 informa o servidor imediatamente a esse 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 atual. Ótimo para atualizar o banco de dados, definir variáveis ​​globais, etc. cabeçalho (status: 204) (ou o outro chamado) cabeçalho (HTTP1.0 204 Sem Resposta) Uma chamada para sessionwriteclose () antes da declaração título ltphp (Localização: URL) sair ( ) Gt é recomendado se você quiser ter certeza de que a sessão está atualizada antes de prosseguir com 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). Apenas para informá-lo 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 do que base64. Base64 com 33 sobrecarga). Por exemplo, use: - cabeçalho (Content-Transfer-Encoding: binário) Content-Encoding é usado para aplicar coisas como a compressão gzip para o conteúdodata. Por exemplo, use: - cabeçalho (Conteúdo-codificação: gzip) Você pode usar etags HTTPs e as últimas datas modificadas 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 (HTTP1.1 304 Not Modified) sair gt Se você quiser remover um cabeçalho e mantê-lo de ser 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á HTTP1.1 200 OK Servidor: Apache2.2.11 (Unix) X-Powered-By: PHP5.2.8 Data: sex 16 de outubro de 2009 23: 05:07 GMT Tipo de Conteúdo: texthtml 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: HTTP1.1 200 OK Servidor: Apache2.2.11 (Unix) X-Powered-By: PHP5.2.8 Data: sex 16 de outubro de 2009 23:05:07 GMT Conexão: fechar Eu só quero adicionar Porque eu vejo aqui muitos cabeçalhos formatados errados. 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) incorreto: cabeçalho (Tipo de Conteúdo: texto de texto) ) 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 errado: Localização. A1 Isso tornará o servidor proxy e os 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 script Javascript: ltphp if (strstr (SERVER HTTPUSERAGENT, MSIE) falso) (Content-type: textjavascript) (Conteúdo-Disposição: inline filenamedownload. js) cabeçalho (Conteúdo - Length:. Filesize (my-file. js)) else header (Content-type: applicationforce-download) cabeçalho (Content-Disposition: attachment filenamedownload. js) cabeçalho (Content-Length:. Filesize (my-file. js) ) (Expirar: 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 o JS e configure Content-Disposition (cada cabeçalho é sensível a maiúsculas e minúsculas a partir 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, o aplicativo-download do Conteúdo-tipo às vezes é necessário 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, configurar os cabeçalhos Cache-Control e Pragma causará um erro. Espero que isso guarde algum tempo. 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 criptografia funciona muito bem, mas a velocidade diminui em 2, agora é 520KiBs. 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 auth headers askPassword (texto Digite a senha) cabeçalho (WWW-Authenticate: reino básico. Utf8decode (texto).) Cabeçalho (HTTP1.0 401 Não autorizado) return 1 A chave é solicitada em O primeiro começo se (isset (SERVER PHPAUTHPW)) askPassword () 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) keylength count (key) Teste Se a faixa é válida em hex se (chave keylength lt 4) askPassword (Cl incorrecte) Echo Cl incorrecte ltbr gt exit () Teste se o comprimento da distância da dune de 2 se ((keylength 2) 0) askPassword (Cl. De comprimento incorreto (múltiplo de 2 uniquement)) Echo Cl de longueur incorrecta (potência de 2 uniquement) ) Ltbr gt exit () Cabeçalho cabeçalho cabeçalho (Content-Type: applicationoctet-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 todo o arquivo se (i keylength 0) j 0 Aplicar uma operação xor entre a chave e o arquivo para a cripta Esta operação tem um monte de tempo de CPU (Stream no 1MiBs no meu servidor Intel E2180) tmp pack (C. Chave j) bufferE (buffer i tmp) lt Le fameux XOR Enviar o buffer de echo de dados criptografadoE Limpe a memória bufferE j buffer flush () isso é essencial para grandes downloads fclose (fp) exit () Feche o arquivo e seu final fclose (fp ) EVITE ZERO BYTE ORDER MARK 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. Passei muito tempo tentando determinar por que o Internet Explorer 7 não estava alertando o usuário para salvar um download com base no nome do arquivo especificado em um nome de arquivo Content-Disposition: attach. Linha de cabeçalho. Eu eventualmente determinou que minha instalação do Apache estava adicionando um cabeçalho adicional: Vary: Host, que estava jogando o IE - por suporte. microsoftkb824847 Eu encontrei configuração manual do cabeçalho Vary dentro do PHP como o seguinte cabeçalho (Variável: User-Agent) permitiu que o IE fosse Comportar-se como pretendido. Espero que isso guarde mais algum tempo. A codificação de um arquivo é descoberta pelo Tipo de Conteúdo, seja 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. orgfaquffom. htmlbom1 Em outra nota: o Safari pode exibir imagens CMYK (pelo menos, a versão OS X, porque ela usa os serviços do QuickTime). Configurar 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 status 3xx já foi configurado. Se você está enviando uma resposta para uma solicitação POST, você pode querer examinar as seções RFC 2616 10.3.3 e 10.3.4. Sugere-se que se você quiser que o navegador obtenha imediatamente o recurso no cabeçalho de localização nesta circunstância, você deve usar 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 (raras) conseqüências como mencionado no bug 42969.

No comments:

Post a Comment