我有一个Apache服务器,其中文件在HTTP post请求中上传(<form enctype="multipart/form-data" action="upload.php" method="post">
)。它不时发生(非常罕见,但它仍然发生),原因仍然是我不能理解,在文件上传后,它在磁盘上的大小将与原始文件的大小不匹配。
我想要做的是在从PHP脚本返回之前捕获这些错误,该脚本将文件从/ tmp复制到其最终目的地。我的第一个想法是比较$_FILES['uploadedfile']['size']
和filesize($target_path)
,这似乎适用于高达2GB的文件。但是,只要文件大小的字节数超过32位,$_FILES['uploadedfile']['size']
就会溢出并变为负数。此外,我怀疑在上传过程中使用此值作为“参考文件大小”可能为时已晚(即它是服务器上的文件大小,而不是客户端上的文件大小)。
有可能从$_SERVER['CONTENT_LENGTH']
中提取文件大小,但此值还包括似乎是请求“元数据”的内容,而我找不到有关如何将数据与实际文件大小分开的文档( “元数据”大小从请求变为请求)
最简单的方法是让客户端将源文件大小作为请求参数发布,但我希望在客户端尽可能少地进行更改。
我还被告知“HTTP PUT”可以首先防止这个问题,但我仍处于调查问题的早期阶段。我仍然想用我当前的POST方法找到解决方案。
作为参考,我的上传脚本现在看起来大致如下:
$id = strtolower($_POST["assetid"]);
$project = strtolower($_POST["project"]);
$target_path = Settings::getAssetPath($project,$id);
if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
if (filesize($target_path) != $_FILES['uploadedfile']['size']){
header("HTTP/1.0 500 Internal Server Error");
$result .= "Uploaded file size does not match source file size!<br />";
}
else {
header("HTTP/1.0 200 OK");
$result .= "The file " . basename($_FILES['uploadedfile']['name']) . " has been uploaded successfully.";
}
} else {
header("HTTP/1.0 500 Internal Server Error");
$result .= "There was an error uploading the file, please try again!<br />";
}
非常欢迎任何想法!
答案 0 :(得分:2)
您的上传脚本不正确。 ['size']
是服务器收到的内容。如果上传因任何原因中止/失败,['size']
将不正确。在使用上传数据执行任何操作之前,您必须检查上传是否成功:
if($_FILES['uploadedfile']['error'] !== UPLOAD_ERR_OK) {
die("Upload failed with error code " . $_FILES['uploadedfile']['error']);
}
错误代码在此处定义:http://www.php.net/manual/en/features.file-upload.errors.php