Força o download do arquivo zip interrompendo alguns milhares de bytes

2

Estou tentando iniciar um download forçado de um arquivo zip contendo uma grande quantidade de imagens. Eu estou usando php para forçar o download e está sendo executado no nginx. O mais estranho é quando eu uso o wget para baixar o arquivo que normalmente funciona, mas quando tento fazer o download dele usando um navegador o arquivo acaba sendo alguns milhares de bytes para o pequeno. Eu tentei vários tamanhos de arquivo com resultados semelhantes. Eu não acho que é um erro de tempo limite porque eu joguei com abrandar a minha velocidade de download e ele sempre para no mesmo lugar (naquele arquivo específico). Eu não tenho idéia porque isso funcionaria no wget, mas não em um navegador. Eu tentei em vários computadores (com diferentes navegadores) e várias redes e obtive os mesmos resultados. Eu brinquei com o código PHP que está servindo o arquivo e com as configurações do php.ini e nginx sem sucesso. Eu realmente aprecio qualquer ajuda ou sugestão que alguém possa ter, isso realmente me ajudaria!

Aqui está o meu código PHP que está forçando o download:

    ob_end_flush();
    header('Content-Description: File Transfer');
    header('Content-Type: application/zip');
    header('Content-Disposition: attachment; filename="'.$name.'.zip"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: ' . filesize($archive));
    flush();
    readfile($archive);

em que $ archive é o caminho para o arquivo zip que o usuário está tentando fazer o download.

    
por Brian 28.07.2011 / 23:46

1 resposta

4

Poderia seu servidor estar aplicando gzip Content-Encoding no arquivo que você está produzindo do PHP (ou você poderia tê-lo habilitado no próprio PHP, ex: zlib.output_compression )? Compactar um arquivo já compactado tende a tornar o arquivo real maior, portanto, se o cliente ler o cabeçalho Content-Length do script, ele interromperá o download antes que o arquivo zipado "maior" seja processado.

wget não suporta compactação, portanto, o servidor não tentará usar Content-Encoding quando você se conectar com o wget. Experimente com curl e veja se você obtém o arquivo quebrado. Se você usar o Chrome, Ctrl - Deslocar - J para abrir as Ferramentas do desenvolvedor e ir para a guia Rede. Enquanto isso estiver aberto, volte para a janela principal da qual você abriu e clique no link para baixar o arquivo. Ele deve criar uma entrada na lista de solicitações na qual você pode clicar, que abrirá uma subjanela com a guia "Cabeçalhos", na qual você poderá ver se tinha a linha Content-Encoding: na seção Response Headers: .

BTW, acho que você quer fazer ob_end_clean() , em vez de ob_end_flush() , pois _flush() envia ao cliente qualquer coisa que você tenha no buffer, enquanto _clean() descarta o buffer e os cabeçalhos que já estão nele. / p>     

por 29.07.2011 / 01:14