保護された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.
それ以外の場合、ファイルは正常にダウンロードされるため、ヘッダーで問題が発生している可能性があります。
何か案は?
この問題にはいくつかの原因が考えられます。ファイルが見つからないか、読み取ることができないため、ファイルの内容は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;
}
}
PHPエラーが発生し、エラーメッセージがZipファイルを台無しにしていることを2つのビールに賭けます。要求されたファイルはおそらく存在しません。
メモ帳または同様のテキストエディタでZipファイルを開き、何が問題なのかを調べます。
回答は遅れていますが、force download
を機能させることができないユーザーにとっては役立つかもしれません。php
スクリプトの先頭に以下を追加します
<?php
Apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);
SetEnv no-gzipdont-varyの行の下に.htaccesswriteという名前のファイルを作成するソリューションは次のとおりです。
ファイルをWebサイトにアップロードします。すでにファイルがある場合は、上記の変更を加えてください
エラーがあるかどうかを確認するためにこれを試してください
error_reporting(0);
ヘッダーを書き込む前に何も印刷しないでください。スクリプトのob_start()を実行し、コードがヘッダーを編集してから、ob_flush()とob_clean()を編集します。
大きなZipファイルでも同様の問題が発生しました。これは私にとってはうまくいきます。
Php.iniで、次のように変更します。
あなたの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 ();