PHP文件传输-这是如何工作的


PHP File Transfer - How does this work?

所以,在另一个问题中,我得到了这个答案:

$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实际读取文件并将其发送到浏览器的过程。如果你省略了它,你可能会下载一个空白文件。