Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用FileReader和php上传大文件_Php_Javascript_Html - Fatal编程技术网

使用FileReader和php上传大文件

使用FileReader和php上传大文件,php,javascript,html,Php,Javascript,Html,我目前正在开发一个上传模块,可以上传非常大的文件(比服务器所允许的要大),并且有一定的进展。参见下面的代码。 它适用于文本文件、图像,甚至文档和pdf文件。 任何其他文件类型都会崩溃。 有人有什么建议吗 var fr = new FileReader; chunkSize = 524288; //chunkSize = window.maxPost; var chunks = Math.ceil(file.size / chunkSize); var chunk = 0; function Se

我目前正在开发一个上传模块,可以上传非常大的文件(比服务器所允许的要大),并且有一定的进展。参见下面的代码。 它适用于文本文件、图像,甚至文档和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();

此外,我还尝试使用readAsBinaryString,但我不知道如何在PHP中处理结果。请注意

这只是在黑暗中拍摄,但看看file.slice API(),它说:

“slice方法返回一个新的Blob对象,其字节范围为 可选的开始参数,直到但不包括可选的结束 参数,并具有作为可选 contentType参数。“

但是,在使用“end”之前,先从“end”中减去1,这是否意味着在每个
块中省略了1个字节(因为结尾字节并不包括在内)


另外,您在使用前会对
$\u POST['filename']
进行清理-不是有人将
./yourscript.php“
放在那里?

当您说“崩溃”时-您实际收到了什么错误消息?还有,你用来上传的特定文件是什么?举一个类型的例子。那应该会有帮助的。是的,很抱歉。它实际上并没有崩溃。它上载文件,但当我尝试下载它时,它是corupt。我试过上传zip、rar、cab甚至exe文件。是的,这就是问题所在!谢谢,是的,我会消毒的。很高兴听到这个消息,也很乐意帮忙。:)
 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);