【发布时间】:2018-09-17 17:24:13
【问题描述】:
我意识到当文件大于 200MB(类似)时,新的 Mozilla Firefox 会返回 allocation size overflow(在 FileReader.ReadAsBinaryString() 上)。
这是我测试客户端网络浏览器的一些代码:
function upload(fileInputId, fileIndex)
{
var file = document.getElementById(fileInputId).files[fileIndex];
var blob;
var reader = new FileReader();
reader.readAsBinaryString(file);
reader.onloadend = function(evt)
{
xhr = new XMLHttpRequest();
xhr.open("POST", "upload.php", true);
XMLHttpRequest.prototype.mySendAsBinary = function(text){
var data = new ArrayBuffer(text.length);
var ui8a = new Uint8Array(data, 0);
for (var i = 0; i < text.length; i++){
ui8a[i] = (text.charCodeAt(i) & 0xff);
}
if(typeof window.Blob == "function")
{
blob = new Blob([data]);
}else{
var bb = new (window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder)();
bb.append(data);
blob = bb.getBlob();
}
this.send(blob);
}
var eventSource = xhr.upload || xhr;
eventSource.addEventListener("progress", function(e) {
var position = e.position || e.loaded;
var total = e.totalSize || e.total;
var percentage = Math.round((position/total)*100);
});
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
console.log("Done");
}else{
console.log("Fail");
}
}
};
xhr.mySendAsBinary(evt.target.result);
};
}
所以我尝试将其更改为 FileReader.ReadAsArrayBuffer(),错误没有出现但数据不一样(因为它不是作为二进制字符串读取的)。
有人有解决这个问题的办法吗?除了 FileReader 实现之外,还有什么方法可以将更大的文件从 JS 上传到原始/字符串中的 Web 服务器?
我在 Mozilla JS 文档上读到:
此功能是非标准的,不在标准轨道上。不要 在面向 Web 的生产站点上使用它:它不适用于每个人 用户。之间也可能存在很大的不兼容 实现和行为可能会在未来发生变化。 - Mozilla
如果不是ReadAsBinaryString,如何实现ReadAsArrayBuffer或ReadAsText
【问题讨论】:
-
Is there any way that we can upload bigger file from JS to Web Server in raw/string other than FileReader implementation?。是的,直接发送文件。文件是 Blob。您正在做的事情绝对没有意义:您正在尝试以其他格式读取 Blob,然后从这种其他格式重建 Blob。只需发送文件,如果您不需要读取文件,请忘记 FileReader。 -
直接通过表单数据发送文件不适用于 1gb 的更大文件。
-
这仅取决于您的服务器配置。如果您将其设置为接受更大的帖子数据,您将能够发送更大的文件。现在,如果你不能正确设置你的服务器,你也可以
slice()原始文件。
标签: javascript arraybuffer binarystream