18

我用 php zip ( http://php.net/manual/de/book.zip.php ) 创建了一个 zip 文件

现在我必须将它发送到浏览器/强制下载它。

4

4 回答 4

42
<?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;
?>
于 2011-09-19T12:30:08.883 回答
6

设置 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将建议浏览器下载文件而不是直接显示它。

于 2011-09-19T12:29:07.200 回答
5

如果服务器上已经有 ZIP,并且如果 Apache 可以通过 HTTP 或 HTTPS 访问此 ZIP,那么,您应该重定向到此文件,而不是使用 PHP“读取它”。

因为不使用 PHP,所以效率更高,因此不需要 CPU 或 RAM ,下载速度会更快,因为也不需要 PHP 读取/写入,只需直接下载。让 Apache 来完成这项工作!

所以一个不错的功能可能是:

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

我希望它会有所帮助。

于 2017-03-14T22:27:19.690 回答
2

您需要这样做,否则您的 zip 将被损坏:

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

所以 content-length 标头需要一个真实的字符串,并且文件大小返回和整数。

于 2013-02-04T15:47:06.663 回答