Cabeçalho de conteúdo PHP não especificando tamanho para meu download forçado

1

Estou tentando permitir que nossos usuários façam o download de um arquivo zip usando um download de força do php. Eu estava tendo problemas para concluir o download e descobriu-se que o arquivo zip estava sendo compactado e enviado para o navegador e, em seguida, o cabeçalho do conteúdo interromperia o download antes de ser concluído (porque zipar um arquivo zip torna o arquivo maior) então adicionei isso ao meu código:

    if(ini_get('zlib.output_compression')) {
        ini_set('zlib.output_compression', 'Off');
    }

Depois de adicionar isso, os zips baixados puderam ser abertos, mas o cabeçalho Content-Length não estava mais sendo enviado. Eu verifiquei os cabeçalhos que foram enviados usando o firebug e os downloads não tinham mais uma barra de progresso. Eu não tenho certeza se os downloads estão funcionando porque eles não estão mais sendo gzipados ou porque o cabeçalho do comprimento do conteúdo não está mais sendo enviado (e o arquivo gzip maior está sendo baixado completamente). Também estou me perguntando por que adicionar essas três linhas faria com que o cabeçalho de duração do conteúdo desaparecesse?

aqui está a seção que está forçando o download:

    if(ini_get('zlib.output_compression')) {
        ini_set('zlib.output_compression', 'Off');
    }

    // Display the download
    ob_end_clean();
    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);
    
por Brian 29.07.2011 / 23:48

3 respostas

1

Não canalize um arquivo através da aplicação PHP, é muito ineficaz. Você pode facilmente usar a funcionalidade interna do Nginx exatamente para isso. É chamado X-Accel-Redirect e esse é o cabeçalho que você precisa retornar do PHP. O Nginx irá vê-lo e enviar o arquivo para um navegador, enquanto o seu processo PHP já está livre para servir outras requisições.

A documentação é aqui

    
por 31.07.2011 / 10:17
0

Siga um destes procedimentos:

  • altere ob_end_clean para ob_clean
  • remove ob_end_clean completamente

Eu sinceramente não sei porque funciona assim. Uma viagem para bugs.php.net provavelmente apareceria.

    
por 30.07.2011 / 01:35
0

Eu descobri que depois de desligar o gzip em php minhas configurações do nginx estavam usando o gzip para compactá-lo, já que ambos tinham o gzip ligado. Eu tive que adicionar um novo cabeçalho que definiu a codificação de conteúdo para application / zip para que o nginx não tentasse compactá-lo com o gzip. Eu adicionei esta linha de código:

    header('Content-Encoding: application/zip');
    
por 30.07.2011 / 23:13

Tags