好的,所以我发现这种方法可以从不同的问题上传大文件:
function sliceit(file)
{
fr = new FileReader;
chunkSize = 1000000;
chunks = Math.ceil(file.size / chunkSize);
chunk = 0;
var isstart = true;
function loadNext() {
start, end,
start = chunk * chunkSize;
if (start > file.size)
start = end+1;
end = start + (chunkSize -1) >= file.size ? file.size : start + (chunkSize -1);
fr.onloadend = function(e)
{
while(!fr.result || fr.result == "" || fr.result == undefined)
{
}
fdata = fr.result;
xmlhttp, form, data;
data = {};
data.filename = document.getElementById("filename0").value;
data.username = document.getElementById("username").value;
data.password = document.getElementById("password").value;
data.public = document.getElementById("public").value;
if(isstart)
{
var form = new FormData();
form.append("filename", data.filename);
form.append("username", data.username);
form.append("password", data.password);
form.append("public", data.public);
form.append("filebytes", fdata);
xmlhttp = jQuery.ajaxSettings.xhr();
xmlhttp.open("POST", "../MakeEmptyFile.php", false);
isstart = false;
}
else
{
form = new FormData();
form.append("filename", data.filename);
form.append("username", data.username);
form.append("password", data.password);
form.append("filebytes", fdata);
xmlhttp = jQuery.ajaxSettings.xhr();
xmlhttp.open("POST", "../AddTo.php", false);
}
xmlhttp.send(form);
console.log(xmlhttp.responseText);
if (++chunk <= chunks)
{
loadNext();
}
else
{
stdlog("Completed.");
}
};
fr.readAsText(file.slice(start, end));
}
loadNext();
}
出于某种原因,每次加载XMLHttpRequest时,都会显示文件数据从未实际发送过。这是因为它太大了,还是什么?谢谢!
答案 0 :(得分:0)
听起来你缺少一些与File API相关的基本概念。我的答案来自你的问题的评论。
首先,以块为单位上传文件的正确方法是在Blob
或File
对象上使用the slice
method。 slice
方法将始终返回另一个Blob
。此Blob
代表您已雕刻的Blob
或File
部分。然后,您可以append
Blob
到您的FormData
对象。您的FormData
对象将以多部分编码的POST请求发送。 Blob
将作为表单字段在请求中的一个多部分边界内表示,就像您附加到FormData
对象的任何其他参数一样。
服务器端,您将读取此Blob
,就像在解析MPE请求时读取任何其他文件一样。这个Blob
需要临时存储在服务器端,以及构成完整文件的任何其他Blob
。收到所有部件后,您需要按照服务器端的正确顺序组装它们。
您当前的方法涉及将文件切片为blob,读取blob的全部内容,然后将内容附加到FormData
对象。这对我来说似乎多余而且效率低下。