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

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

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