所以,在另一个问题 ,我得到了这个答案:
$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) . '"');
我对整个解决scheme有一些疑问,为了增加我的理解:
1.使用basename()
的目的只是从文件名中basename()
path吗?
2. realpath()
的目的是什么? 在我的使用中,似乎没有任何区别。 基于我发现的,似乎只是“标准化”文件pathinput。 那是对的吗?
3.我似乎不需要最后三行来完成这项工作:
header("Content-Length: " . filesize($cf)); header("Content-Type: application/octet-stream"); readfile(realpath($cf));
我需要他们吗? 他们在做什么? 我应该注意到,我正在使用本地主机进行testing,以防有所作为。
使用这种方法提供文件下载时,是否有任何安全考虑?
是使用basename()的目的只是从文件名去除路径?
是的,这个头是浏览器用来向用户呈现一个文件名来保存下载文件的。 您不希望为用户提供完整的文件路径,只是文件名,而且我不确定浏览器是否会向用户提供完整的文件路径。
realpath()的目的是什么? 在我的使用中,似乎没有任何区别。 基于我发现的,似乎只是“标准化”文件路径输入。 那是对的吗?
它解决了与其绝对路径的相对和象征性的联系,这可能是你“标准化”的意思。 如果你只是提供绝对路径,它什么都不会做。
我似乎不需要最后三行来完成这项工作:
header(“Content-Length:”。filesize($ cf));
头(“Content-Type:application / octet-stream”);
ReadFile的(真实路径($ CF));
我需要他们吗? 他们在做什么? 我应该注意到,我正在使用本地主机进行测试,以防有所作为。
你应该保留所有的。 前两个标题告诉浏览器文件有多大,文件是什么类型。 现在,您使用的是通用媒体类型,但是如果要发送PDF文件,则可以使用更具体的PDF媒体类型,浏览器会让用户知道他们正在下载PDF。
如果没有最后一行,我也不会认为下载是正常的……这就是PHP实际读取文件并将其发送到浏览器的过程。 如果你忽略它,你最终可能会下载一个空白文件。