[英]Large file uploads using FileReader and php
我目前正在为非常大的文件(比服务器允许的更大)开发一个上传模块,并带有进度和所有这些东西。 请参阅下面的代码。 它适用于文本文件、图像,甚至 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 中的结果。 请指教
这只是黑暗中的一个镜头,但查看 file.slice API ( http://www.w3.org/TR/FileAPI/#dfn-slice ),它说:
“slice 方法返回一个新的 Blob 对象,其字节范围从可选的开始参数到但不包括可选的结束参数,并且具有一个类型属性,它是可选的 contentType 参数的值。”
但是,在使用它之前从“end”中减去 1 - 这是否意味着您在每个chunk
留下 1 个字节(因为无论如何都不包括结束字节)?
另外,您在使用$_POST['filename']
之前确实对其进行了消毒 - 不是有人将"../yourscript.php"
放在那里?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.