在PHP中,我正在使用
header('Content-Disposition: attachment;filename="mysong.mp3"');
强制下载某个文件。
在其中一个案例中,文件大小为零字节(即使文件存在且为 3MB)。这就是为什么我问自己:文件名参数实际上是如何获取文件的?没有提供访问它的路径,即使它嵌套在多个文件夹中也是如此。
我在这个 RFC 或其他任何地方都没有找到任何有用的东西。我可能正在问一些我错过的明显问题。
Content-Disposition: attachment;filename="mysong.mp3"
标头告诉浏览器不要尝试显示响应的正文,而是将其保存在文件中;值"mysong.mp3"是对文件名的建议,但浏览器通常会询问用户使用什么名称(并提供"mysong.mp3"作为默认值)。
这行代码不会从磁盘读取任何文件,也不会将任何内容发送回浏览器。您的代码必须执行此操作。它可以从文件中读取内容或动态生成内容或通过任何其他方式生成内容;这完全取决于你。
例如,如果文件中有内容,则可以执行以下操作:
$filepath = '/foo/bar/file.mp3'; // put the correct file path and name here
header('Content-Disposition: attachment;filename="mysong.mp3"');
header('Content-Length: '.filesize($filepath));
readfile($filepath);
Content-Length
标头不是必需的,但它对于浏览器生成一个漂亮的进度条、估计剩余时间并在传输结束时知道文件是否成功传输(当它收到宣布的字节数时)或出现问题(接收到更少的字节