【问题标题】:Large file uploads using FileReader and php使用 FileReader 和 php 上传大文件
【发布时间】:2013-02-14 13:56:22
【问题描述】:

我目前正在为非常大的文件(比服务器允许的更大)开发一个上传模块,其中包含进度和所有这些东西。请参阅下面的代码。 它适用于文本文件、图像,甚至 doc 和 pdf 文件。 对于任何其他文件类型,它都会崩溃。 有人有什么建议吗?

var fr = new FileReader;
chunkSize = 524288;
//chunkSize = window.maxPost;
var chunks = Math.ceil(file.size / chunkSize);
var chunk = 0;
function SendSlice() {
    var start, end;
    start = chunk * chunkSize;
    if (start > file.size) {
        start = end + 1;
    }
    end = start + (chunkSize - 1) >= file.size ? file.size : start + (chunkSize - 1);
    status = chunk == 0 ? "start" : (chunk == chunks ? "end" : "progress");
    if (status == 'start') {
            $("#upload-area").append("<p>Upload started for file " + file.name + "</p>");
    }
    fr.onload = function(e) {
        var sliceData = e.target.result;
        $.ajax({
            type : "POST",
        url : "uploader.php",
        data : {
            filename : file.name,
            status : status,
            slice : sliceData
        }
        }).success(function(data) {
            if (++chunk <= chunks) {
                SendSlice();
                var progress = (chunk / chunks) * 100;
                $("#progress-text").html(progress.toFixed(2) + "%");
                $("#progress").css({
                    width : progress + "%"
                });
            } else {
                $("#upload-area").append("<p>File " + file.name + " uploaded succesfully. Download file <a target='_blank' href='uploads/" + file.name + "'>here</a></p>");
            }
        });
    };
    fr.readAsDataURL(file.slice(start, end));
}
SendSlice();

还有php代码:

 if($_POST['status'] == 'start') {
if (file_exists("uploads/" . $_POST['filename'])) {
    unlink("uploads/" . $_POST['filename']);
}
 }
 $data = explode(",", $_POST['slice']);
 $data = $data[1];
 $data = base64_decode($data);
 file_put_contents("uploads/" . $_POST['filename'], $data, FILE_APPEND);

另外,我尝试过使用 readAsBinaryString,但我不知道如何在 PHP 中处理结果。请指教

【问题讨论】:

  • 当您说“崩溃”时 - 您实际收到的错误信息是什么?而且,您用来上传的特定文件是什么 - 请举例说明该类型。这应该会有所帮助。
  • 是的,很抱歉。它实际上并没有崩溃。它上传文件,但是当我尝试下载它时,它已损坏。我试过上传 zip、rar、cab 甚至 exe 文件。

标签: php javascript html


【解决方案1】:

这只是在黑暗中拍摄,但查看 file.slice API (http://www.w3.org/TR/FileAPI/#dfn-slice),它说:

"切片方法返回一个新的 Blob 对象,其字节范围为 可选的 start 参数 upto 但不包括可选的 end 参数,并带有一个类型属性,该属性是可选的值 contentType 参数。”

但是,您在使用之前从“end”中减去 1 - 这是否意味着您在每个 chunk 处遗漏了 1 个字节(因为无论如何都不包含结束字节)?

另外,您在使用 $_POST['filename'] 之前会对其进行消毒 - 不是有人将 "../yourscript.php" 放入其中吗?

【讨论】:

  • 是的,这正是问题所在!谢谢
  • 是的,我会对其进行消毒。
  • 很高兴听到,也很乐意提供帮助。 :)
猜你喜欢
  • 1970-01-01
  • 2013-12-11
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多