发送zip文件到浏览器/强制直接下载

时间:2011-09-19 12:22:12

标签: php zip force-download

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

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

4 个答案:

答案 0 :(得分:36)

<?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;
?>

答案 1 :(得分:5)

设置内容类型,内容长度和内容处置标题,然后输出文件。

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

设置Content-Disposition: attachment会建议浏览器下载文件而不是直接显示文件。

答案 2 :(得分:2)

你需要这样做,否则你的拉链会被破坏:

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

所以content-length头需要一个真正的字符串,filesize返回整数。

答案 3 :(得分:2)

如果您已在服务器上安装了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

我希望它会有所帮助。