使用FileReader和php进行大文件上传

3

我正在开发一个上传非常大的文件(大于服务器允许的大小)的模块,包括进度等等。请看下面的代码。 它可以处理文本文件、图片,甚至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中处理结果。请给予建议。


当你说“崩溃”时,你实际上收到了什么错误消息?另外,你正在使用哪个特定文件进行上传 - 给出一个类型的示例。这应该有所帮助。 - Aaron Saray
是的,对此我感到抱歉。实际上并没有崩溃。它会成功上传文件,但当我尝试下载时,文件会损坏。我尝试上传了zip、rar、cab甚至exe文件。 - d4rkpr1nc3
1个回答

4
这只是一个猜测,但是查看file.slice API (http://www.w3.org/TR/FileAPI/#dfn-slice),它说:

"slice方法返回一个新的Blob对象,其字节范围从可选的start参数到但不包括可选的end参数,并且具有type属性,该属性是可选的contentType参数的值。"

然而,在使用之前,您从 "end" 中减去1 - 这是否意味着您在每个chunk中留出1个字节(因为结束字节无论如何都不包含)?

此外,在使用$_POST['filename']之前,您会对其进行过滤 - 防止有人在其中放置"../yourscript.php"吗?


是的,那正是问题所在!谢谢。 - d4rkpr1nc3
是的,我会对其进行消毒处理。 - d4rkpr1nc3
很高兴听到,并很高兴能够帮忙。 :) - Aaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接