【问题标题】:Compare size of large files on server with size in post request, in PHP在 PHP 中比较服务器上大文件的大小与发布请求中的大小
【发布时间】:2013-02-25 14:44:31
【问题描述】:

我有一个 Apache 服务器,文件在 HTTP 发布请求 (<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 />";
}

非常欢迎任何想法!

【问题讨论】:

    标签: php apache http post put


    【解决方案1】:

    您的上传脚本不正确。 ['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

    【讨论】:

    • 谢谢,这就是我的怀疑。事实证明,问题出在客户端,他上传的有问题的文件被截断,因为它实际上包含用于多部分 HTTP 请求的 HTTP 边界(“------BoundaryXYZ”),硬编码在文件中...
    猜你喜欢
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多