所以,在另一个问题中,我得到了这个答案:
$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进行测试,以防出现差异。
在使用这种方法提供文件下载时,我应该考虑什么安全因素吗?
使用basename()的目的只是从文件名?
是的,这个头是浏览器用来向用户提供文件名以将下载的文件另存为的。你不想向用户提供完整的文件路径,只提供文件名,我不确定浏览器是否会向用户提供完全的文件路径。
realpath()的目的是什么?在我的习惯中,它似乎意味着不差异。根据我的发现"标准化"文件路径输入。这是正确的吗?
它将相对和符号链接解析为它们的绝对路径,这可能就是你所说的"标准化"。如果你只给它提供绝对的路径,它什么都不会做。
我似乎不需要最后三行来完成这项工作:
header("内容长度:".filesize($cf));
header("内容类型:应用程序/八位字节流");
readfile(realpath($cf));
我需要它们吗?他们做什么?我应该注意,我只是在测试使用localhost,以防出现差异。
你应该把它们都留着。前两个标题告诉浏览器文件的大小和文件类型。现在你使用的是通用媒体类型,但如果你要发送,比如PDF文件,你可以使用更具体的PDF媒体类型,浏览器会让用户知道他们正在下载PDF。
我也认为如果没有最后一行,下载是不可行的。。。这就是PHP实际读取文件并将其发送到浏览器的过程。如果你省略了它,你可能会下载一个空白文件。