web-dev-qa-db-ja.com

.Zipファイルをダウンロードすると、破損したファイルphpが実行されます

保護されたZipファイルを強制的にダウンロードしようとしています(最初にログインせずにアクセスしてほしくない)。

loginなどの関数を作成しましたが、ダウンロードしたファイルが破損しているという問題が発生しています。

これが私が持っているコードです:

$file='../downloads/'.$filename;
header("Content-type: application/Zip;\n");
header("Content-Transfer-Encoding: Binary");
header("Content-length: ".filesize($file).";\n");
header("Content-disposition: attachment; filename=\"".basename($file)."\"");
readfile("$file");
exit();

エラーは次のとおりです。Cannot open file: It does not appear to be a valid archive.

それ以外の場合、ファイルは正常にダウンロードされるため、ヘッダーで問題が発生している可能性があります。

何か案は?

15
Troy

この問題にはいくつかの原因が考えられます。ファイルが見つからないか、読み取ることができないため、ファイルの内容はPHPエラーメッセージです。またはHTTPヘッダーはすでに送信されています。または、追加の出力があり、それが破損している可能性があります。ファイルの内容。

次のように、スクリプトにエラー処理を追加してみてください。

$file='../downloads/'.$filename;
if (headers_sent()) {
    echo 'HTTP header already sent';
} else {
    if (!is_file($file)) {
        header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
        echo 'File not found';
    } else if (!is_readable($file)) {
        header($_SERVER['SERVER_PROTOCOL'].' 403 Forbidden');
        echo 'File not readable';
    } else {
        header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
        header("Content-Type: application/Zip");
        header("Content-Transfer-Encoding: Binary");
        header("Content-Length: ".filesize($file));
        header("Content-Disposition: attachment; filename=\"".basename($file)."\"");
        readfile($file);
        exit;
    }
}
28
Gumbo

PHPエラーが発生し、エラーメッセージがZipファイルを台無しにしていることを2つのビールに賭けます。要求されたファイルはおそらく存在しません。

メモ帳または同様のテキストエディタでZipファイルを開き、何が問題なのかを調べます。

8
Pekka 웃

回答は遅れていますが、force downloadを機能させることができないユーザーにとっては役立つかもしれません。
phpスクリプトの先頭に以下を追加します

<?php
Apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
1
Pedro Lobito

SetEnv no-gzipdont-varyの行の下に.htaccesswriteという名前のファイルを作成するソリューションは次のとおりです。

ファイルをWebサイトにアップロードします。すでにファイルがある場合は、上記の変更を加えてください

1
abobjects.com

エラーがあるかどうかを確認するためにこれを試してください

error_reporting(0);

ヘッダーを書き込む前に何も印刷しないでください。スクリプトのob_start()を実行し、コードがヘッダーを編集してから、ob_flush()とob_clean()を編集します。

0
Shuhad zaman

大きなZipファイルでも同様の問題が発生しました。これは私にとってはうまくいきます。

Php.iniで、次のように変更します。

  • Upload_max_filesize-1500 M
  • Max_input_time-1000
  • Memory_limit-640M
  • Max_execution_time-1800
  • Post_max_size-2000 M

あなたのphpファイルで。

    $filename = "MyFile.Zip";           
    $filepath='../downloads/'.$filename;    //your folder file path    
    header($_SERVER['SERVER_PROTOCOL'].' 200 OK');
    header("Content-Type: application/Zip");
    header("Content-Transfer-Encoding: Binary");    
    header("Content-Length: ".filesize($filepath)); 
    header("Content-Disposition:attachment;filename=\"".basename($filepath)."\"");


    while (ob_get_level()) 
    {
     ob_end_clean();
     }
    readfile($filepath);   
    exit;
    ob_start ();
0
GPB83