【问题标题】:Header file download creates new file instead of sending one from server (PHP)头文件下载创建新文件,而不是从服务器发送一个(PHP)
【发布时间】:2013-11-03 21:28:47
【问题描述】:

我有以下代码试图下载服务器上的特定文件:

$file = 'upload/Order.txt';
header("Pragma: public", true);
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename="basename.$file);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));

所发生的只是它导致浏览器下载一个文件,在我的例子中是“Order.txt”,但它是空白的,它只是在无处创建这个文件。它对 $file 的“upload/”路径部分没有任何作用。

感谢您的帮助,我发现标题真的很混乱,为什么我不能只拥有“下载($file)”是我无法理解的。

编辑:我会为一个问题苦苦挣扎好几天,最后决定在这里问,然后我自己解决后立即。

我将文件的位置更改为与 PHP 脚本相同,但我仍然想知道如何使其在它们分开的情况下工作。我还补充说:

readfile($file);

如果我更改了这 2 个更改中的一个,它将不起作用。

还有细线,新代码:

$file = 'Order.txt';
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
readfile($file);

【问题讨论】:

  • php, file download的可能重复
  • 你只需要1个Content-Type头,发几个都没用。

标签: php file header download


【解决方案1】:

您应该在标头之后将文件内容打印到标准输出:

$file = 'upload/Order.txt';
header("Pragma: public", true);
header("Expires: 0"); // set expiration time
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=".basename($file));
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($file));
$handle = fopen($file, "r");        
$contents = fread($handle, filesize($file));
fclose($handle);
echo $contents;

【讨论】:

  • 小文件没有区别(大文件我们可以分段读取,避免超出内存)
  • 顺便说一句,不要发送Content-Length 标头,它们不需要并且容易产生错误。
【解决方案2】:

尝试更改此行:

header("Content-Disposition: attachment; filename='".basename($file)."';");

【讨论】:

  • filename= 应该被引用 filename=""
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2017-10-18
相关资源
最近更新 更多