これにはたくさんのスレッドがあることは知っていますが、ここで特有の問題に直面しています
まず、ダウンロード用のzipファイルを出力しようとしています。次のコードがあります
$file = '/home/www/public/'.$filename;
header('Content-Type: application/zip');
header("Content-Transfer-Encoding: Binary");
header('Content-disposition: attachment; filename='.$filename.'');
header('Content-Length: '.filesize($file));
echo readfile($file);
問題は、これらのヘッダーでダウンロードされた zip が破損していることです。開けません (アーカイブの予期しない終了)。Content-length ヘッダーを削除しても破損しませんが、ユーザーはダウンロード時間を確認できません。
exeファイルにも同じコードを適用したかったのですが(タイプをアプリケーション/オクテットストリームに変更するだけです)、同じ結果が得られました。ファイル自体は確かに問題ありません。ダウンロード中に何かが台無しになるだけです
どんな助けでも大歓迎
以下は、私が使用している実際のコードです(2つの変更が既に提案された後)。私はstackoverflowのためにそれを単純化しましたが、おそらくそこに何かがあります
$id = post('file');
$object = Software_Files_Model::create()->find($id);
if ($object->software) {
$file = '/home/www/public'.$object->software->getPath();
$size=$object->software->size;
header('Content-Type: application/zip');
header("Content-Transfer-Encoding: Binary");
header('Content-Disposition: attachment; filename='.$object->software->name.'');
header('Content-Length: '.$size);
readfile($file);
exit;
}
もう一度追加しますが、ファイルのダウンロードは全体としてです。それが 10 メガバイトの場合、10 メガバイトすべてが正常にダウンロードされ、ファイル名とすべてが保持されます。zip アーカイブを開いてコンテンツを表示することもできます。メッセージが表示されるのは解凍中です