你能相信 PHP 中 $_FILES 数组给出的文件大小吗?

Can you trust file size given by $_FILES array in PHP?

抱歉,如果它是微不足道的或明显的,但我无法通过谷歌搜索找到答案。

$_FILES['name']数组中的size值从何而来?您可以相信它的值 ($_FILES['name']['size']) 还是您仍然应该使用 filesize() 函数检查它?

换句话说,是否需要通过filesize函数检查实际文件大小来判断上传是否正确?

PHP 似乎确实在上传文件后重新计算了文件的大小。虽然客户端确实发送了一个 header 指定文件的 content-length,但根据测试(使用 PHP 5.5),这个 header 被简单地忽略了,相反,长度是测量。就个人而言,我总是会使用 filesize() 来获取文件大小,因为您可以更加确定正在使用哪种度量,但这最终取决于您。无论哪种方式,$_FILES['file_name']['size'] 似乎都是一个安全的值。

您应该检查客户端报告的 $_FILES['file_name']['size'] 是否等于 filesize() 给出的值。差异可能表示上传文件在传输过程中出现错误。

如果文件上传正确且一切正常,您可以使用PHP superglobal $_FILES 提供的信息。使用 filesize() 会增加一些开销,因为 OS 需要检查文件的大小。这取决于您,但是检查 PHP 源代码可以清楚地表明它正确计算了 HTTP 多部分请求中的文件大小。基本上,如果您要 filesize() 文件,您将再次做同样的工作。

您可以直接从超全局变量中信任这一点的原因是多部分请求提供了数据所在的边界。根据定义,如果不遵循提取数据的协议,就不可能获得损坏的数据。换句话说,这意味着浏览器发送 "delimiter" 并且 PHP 只是找到它并开始检查文本中该分隔符之间的数据。为此,它会准确地分配所需的内存,并且可以立即缓存分配的数量——该数量就是文件大小。如果在此过程中出现任何问题,您将收到错误。因此,如果文件上传正确,关于大小的信息是可信的。