2016-09-21 27 views
0

使用FileReader.readAsArrayBuffer()我从二进制文件中读取了一些内容,并得到了一个ArrayBuffer。Javascript,从ArrayBuffer到RAW二进制数据:如何?

现在我必须使用JQuery $ .ajax发送RAW二进制读取。

FileReader.readAsBinaryString()函数已弃用,因为标记为非标准。我尝试了这里也提出的不同解决方案,但由于二进制 - > UTF转换而改变了数据。

除了循环访问数组,并将每个字节添加到要发送的字符串之外,任何提示都强烈推荐使用。

感谢您的帮助! :-)

+0

为什么你需要发送原始二进制文件?如果你能够使用FileReader,你已经有了blob,只需发送它。如果你真的想读二进制文件,那么你可以使用'XHR.open('get',URL.createObjectURL(blob))' – Kaiido

+0

1.发送一个1Mb的大文件块(> 1Gb)而不用修改php。 ini限制在哪里是不可能的; 2.在文件xfer失败的情况下使用resume执行文件上传; 3.引入每个块的文件校验和,并在出现错误时及时恢复。 简而言之,我的网络应用程序集成了一些功能,即每个文件上传器无需外部库就可以集成这些功能,因为我必须在上传文件后对其进行一些修复。 –

+1

好的,将这些信息包含在您的问题的编辑中会很好。对于1,您只能发送大Blob块(比较'blob.slice()'),然后[合并它们在服务器端](http://stackoverflow.com/questions/36045690/merging-file-chunks -in-PHP)。对于2.以上也将工作。对于3.不知道如何实现它,但读取和解析正面的1GB文件听起来像是一个不好的主意IMM。 – Kaiido

回答

0

您是否试过FileReader.readAsText方法?它允许指定编码,但默认使用UTF-8。

https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsText

编辑

要发送的jQuery文件,你并不需要先读。你可以简单地使用FormData对象发送它。

请参阅How can I upload files asynchronously?

+0

UTF-8更改数据!它应该是二进制安全的! –

+0

UTF-8不会更改数据。给定编码中的字符串只是二进制流的表示。如果使用FileReader读取的文件包含文本,则需要知道其编码才能将其正确转换为字符串。你用ASCII码试过了吗? –

+0

再次测试:原始文件是170'040字节的PNG,但FileReader.readAsText返回字符串长度为306'478 ... 请解释您引用“ASCII”的原因,因为它不是有效的编码。 –

0

只是觉得愚蠢的使用FileReader ...在所有。您不必阅读文件内容即可发送。

var blob = new Blob(['abcdef']) // simulate a file 
var chunkSize = 2 // bytes to upload in each request 
var chunks = [] // result will be 3 chunks [ab, cd, ef] 
var offset = 0 // byte offset 

// build the chunk array 
do { 
    chunks.push(blob.slice(offset, offset + chunkSize)) 
    offset += chunkSize 
} while (offset <= blob.size) 

// upload the chunk one at the time 
chunks.reduce((uploaded, nextChunk) => 
    uploaded_chunk.then(() => 
     fetch('/upload', { 
      method: 'post', 
      body: nextChunk 
     }) 
}, Promise.resolve()).then(() => { 
    // all chunks has been uploaded in sequential order 
}) 

你可能不希望使用jQuery AJAX要么因为它需要你使用.ajax(不.post),你需要设置processData & contentTypefalse

看这个怎么用jQuery发送一个blob:How can javascript upload a blob?

fetch是IMO更好,然后jQuery的ajax和内置到浏览器。只是有时需要一个polyfill


编辑:,这样你就不必做这一切黑客上传较大的文件最好是,如果你可以改变php.init允许更大上传

+0

我必须将文件内容读取到: - 监视并反馈文件上传的进度; - 发送并对每个发送的块进行校验和; - 发生错误时重新发送块; - 在服务器上,我可能无法访问php.ini,而且我不希望在发送8Gb文件后发现上传失败。 因此我无法使用建议的解决方案。 –

+0

@FrancescoPiraneoG。,这里唯一缺少的是进度处理,对于这个功能你需要XHR。但剩下的答案保持不变。如果发生错误,要重新发送,使用'fetch'只需使用'.catch'并为XHR'onerror'使用。 – Kaiido

+0

yikes ...我会推荐[WebTorrent](https://webtorrent.io/)在这里+一些混合服务器端洪流客户端,将执行校验,暂停,恢复等...或者所有NodeJS风格的流和管道然后还听进展事件反正......也许:https://github.com/23/resumable.js是你的东西? – Endless

0

首先,读为ArrayBuffer:这似乎是最灵活的解决方案:

var reader = new FileReader(); 
reader.readAsArrayBuffer(blob); 

...和回调转换为BLOB:

$(reader).on("loadend", function(evt) { 
     if (evt.target.readyState === FileReader.DONE) { // DONE == 2 
      blob = new Blob([evt.target.result]); 
     } 
    }); 

最后一个形式发送:

var fd = new FormData(); 
    fd.append('xferID', xferID); 
    fd.append('data', blob); 

    $.ajax({ 
     url: 'http://......', 
     data: fd, 
     processData: false, 
     contentType: false, 
     type: "POST", 

     success: function(resultJSON) {...}, 
     error: function(resultJSON) {...} 
    } 

这显然只是一个大纲;在PHP方面,您将收到$ _FILES超全局上的BLOB数据。

希望得到这个帮助。 :-)

相关问题