Pergunta

Eu estou tentando usar o seguinte código para criar um arquivo zip de um diretório e servi-lo para o usuário através de um download http:

 // write the file
file_put_contents($path . "/index.html", $output);

// zip up the contents
chdir($path);
exec("zip -r {$course->name} ./");

$filename = "{$course->name}.zip";

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' .urlencode($filename));
header('Content-Transfer-Encoding: binary');

readfile($filename);

Eu sou capaz de criar o arquivo zip, mas baixá-lo através de HTTP não está funcionando. Se eu baixar o arquivo zip que é criado usando um cliente de FTP, em seguida, do Mac Stuffit Expander descomprime os arquivos muito bem, mas se eu baixá-lo através de HTTP, o descompactador mac cria um loop infinito. O que quero dizer com isto é dizer o download do arquivo que é chamado course.zip, em seguida, descompactar o arquivo dá course.zip.cpgz e descompactar o arquivo dá course.zip novamente.e por diante.

Alguém tem alguma idéia?

Obrigado!

Foi útil?

Solução

  1. Re fechando-lo cada vez que é solicitada não é uma boa idéia. Tente fazer isso somente se o arquivo ZIP ainda não existir.

  2. Se é um arquivo temporário ou apenas um único arquivo pequeno que deseja transferir comprimido, tente usar ob_start('ob_gzhandler') vez, simplier, menor, mais limpo. O arquivo é transferido comprimido, mas ele é salvo em seu formato original pelo lado do cliente.

  3. Especificando o cabeçalho Content-Length é necessária para permitir que o downloader de saber o final do arquivo, permitindo o controle de progresso, a detecção de corrupção do arquivo e evitando o jeito da sessão HTTP (se Connection está em Fortaleza modo -Alive), talvez a falta deste cabeçalho é a raiz do problema.

Outras dicas

Eu tive esse problema e descobriu-se o arquivo ZIP baixado tinha uma nova linha inserida no início.

resolvido usando funções ob_clean e descarga

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=".basename($archive_file_name));
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($archive_file_name));
    ob_clean();
    flush();
    echo readfile("$archive_file_name");

Como sugerido por karim79 , vou colocar o meu comentário como uma resposta: o que acontece se você alterar o tipo de MIME da aplicação / octeto de fluxo para application / zip?

Além disso, eu vejo que você está usando um programa zip linha de comando, mas você não verificar para o sucesso do zip, e também não verificar se o arquivo existe antes de tentar enviá-lo para o navegador do usuário final . Tente difícil codificação de um nome de arquivo manualmente usando zip para garantir um arquivo zip adequadamente formado, e depois ver se o seu código vai cuspi-la no navegador corretamente.

O que você está vendo é que o utilitário de arquivo não está reconhecendo o arquivo zip como um arquivo zip, e tentou fechar o arquivo zip em si. A segunda operação simplesmente descompacta o primeiro arquivo criado, por isso nunca realmente abrir o arquivo em tudo. Isto é devido ao zip sendo corrompido.

É possível que o navegador de alguma forma mutilado o arquivo zip (conversões de nova linha alguém?) Durante o processo de download. Como mencionado, verifique o tipo mime e usar o php header () para definir o tipo MIME correto (application / zip).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top