web-dev-qa-db-ja.com

ブラウザにZipファイルを送信する/直接ダウンロードを強制する

php Zip( http://php.net/manual/de/book.Zip.php )で作成したZipファイル

今私はそれをブラウザに送る/それを強制的にダウンロードする必要があります。

15
Martin Huwa
<?php
    // or however you get the path
    $yourfile = "/path/to/some_file.Zip";

    $file_name = basename($yourfile);

    header("Content-Type: application/Zip");
    header("Content-Disposition: attachment; filename=$file_name");
    header("Content-Length: " . filesize($yourfile));

    readfile($yourfile);
    exit;
?>
36
Amber

Content-type、content-length、およびcontent-dispositionヘッダーを設定して、ファイルを出力します。

header('Content-Type: application/Zip');
header('Content-Disposition: attachment; filename="'.$filename.'"');
header('Content-Length: '.filesize($filepath) );
readfile($filepath);

設定Content-Disposition: attachmentは、ブラウザにファイルを直接表示するのではなく、ダウンロードするように提案します。

5
Kaivosukeltaja

サーバーにすでにZipがあり、このZipがApacheまたはHTTPまたはHTTPSで到達可能な場合、PHPで「読み取る」のではなく、このファイルにリダイレクトする必要がありますです。

はるかに効率的です PHPを使用しないのでCPUもRAMも必要ありません、そして---になりますダウンロードの高速化、PHPによる読み取り/書き込みも不要、直接ダウンロードのみ。Apacheで作業しましょう!

したがって、Nice関数は次のようになります。

if($is_reachable){
    $file = $relative_path . $filename; // Or $full_http_link
    header('Location: '.$file, true, 302);
}
if(!$is_reachable){
    $file = $relative_path . $filename; // Or $absolute_path.$filename
    $size = filesize($filename); // The way to avoid corrupted Zip
    header('Content-Type: application/Zip');
    header('Content-Disposition: attachment; filename=' . $filename);
    header('Content-Length: ' . $size);
    // Clean before! In order to avoid 500 error
    ob_end_clean();
    flush();
    readfile($file);
}
exit(); // Or not, depending on what you need

お役に立てば幸いです。

2
XDjuj

この方法で行う必要があります。そうしないと、Zipが破損します。

$size = filesize($yourfile);
header("Content-Length: \".$size.\"");

したがって、content-lengthヘッダーには実際の文字列と、filesizeの戻り値と整数が必要です。

2
Roger