【发布时间】:2016-07-29 17:14:55
【问题描述】:
所以,在另一个QUESTION,我得到了这个答案:
$filename="filetodownload.xyz";
$cf = realpath("/non-webaccessible-folder/".$filename);
$file=$cf;
header('Content-Disposition: attachment; filename="' . basename($cf) . '"');
header("Content-Length: " . filesize($cf));
header("Content-Type: application/octet-stream");
readfile(realpath($cf));
只需使用顶部标题行,我就能让它为我的目的工作:
header('Content-Disposition: attachment; filename="' . basename($cf) . '"');
我对整个解决方案有一些疑问,以增加我的理解:
1. 使用basename() 的目的仅仅是为了从文件名中去除路径吗?
2.realpath()的目的是什么?在我的使用中,它似乎没有任何区别。根据我的发现,它似乎只是“标准化”文件路径输入。对吗?
3.我似乎不需要最后三行来完成这项工作:
header("Content-Length: " . filesize($cf));
header("Content-Type: application/octet-stream");
readfile(realpath($cf));
我需要它们吗?他们在做什么?我应该注意,我只是使用 localhost 进行测试,以防万一。
在使用这种方法提供文件下载时,我应该注意哪些安全问题?
【问题讨论】:
-
For 3 是让浏览器知道文件有多大,以便用户可以看到。否则它会显示为 downloaded 1mb of unknown filesize
-
使用真实路径的原因有很多。对于这种情况下的答案,我使用它作为包含该文件的文件夹的路径是 Windows 服务器上的虚拟目录。如果没有 realpath,file_exists 和其他功能似乎无法可靠地工作。一旦我使用了 realpath,脚本就会按预期运行。这是我当时从另一个地方找到的建议。
标签: php linux apache download file-transfer