1

可能重复:
强制使用 PHP 下载文件

当我们需要强制用户下载文件时,我们使用带有多个参数/选项的标题。如果我使用怎么办

header("location:test.xlsx");

这是有效的:) 使用这个快捷方式有什么缺点吗?

4

4 回答 4

1

这种方法应该可以解决这里提到的问题

下载.php?filename=test.xlsx

if isset ($_GET['filename']){
$filename = $_GET['filename']
}
else{
die();
}

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);

当然不要忘记保护它,这样用户就不能下载其他文件

于 2012-06-07T14:54:32.430 回答
1

这种方法有几个缺点:

  1. 如果文件是浏览器可以读取的文件,则不会下载(如.txt.pdf.html.jpg.png.gif),而只是在浏览器中显示

  2. 用户获得文件的直接链接。很多时候,您不想要这个,因为他们可以将此链接提供给其他人,所以...

    1. 这将花费您更多的带宽
    2. 它不能用于私人文件
    3. 如果是图片,他们可以热链接到它
于 2012-06-07T14:43:49.957 回答
0

您所做的只是重定向到一个文件。这与他们直接去那里没有什么不同。

如果您尝试强制下载,则需要Content-Disposition适当地设置标题。

header('Content-Disposition: attachment');

请注意,重定向时不能使用此标头...此标头必须与文件内容一起发送。另见: https ://stackoverflow.com/a/3719029/362536

于 2012-06-07T14:40:38.260 回答
0

并非每个文件都被强制下载。

如果您要在 .jpg 上使用该 header(),浏览器将不会打开下载对话框,而只会显示图像。

于 2012-06-07T14:40:50.477 回答