Javascript,从ArrayBuffer到RAW二进制数据:如何?

时间:2016-09-21 16:17:10

标签: javascript filereader

使用FileReader.readAsArrayBuffer()我从二进制文件中读取了一些内容,并得到了一个ArrayBuffer。

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

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

除了在数组中循环并将每个字节添加到要发送的字符串之外,任何提示都是强烈的贬义。

感谢您的帮助! : - )

3 个答案:

答案 0 :(得分:0)

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

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

修改

要使用jQuery发送文件,您不需要先阅读它。您只需使用FormData对象发送它即可。

请参阅How can I upload files asynchronously?

答案 1 :(得分: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&amp; contentTypefalse以及更多

看看如何使用jQuery发送blob:How can javascript upload a blob?

fetch比jQuery的ajax更好,并且内置于浏览器中。有时需要polyfill

编辑:如果您可以更改php.init以允许更大的上传,那么您最好不要为了上传更大的文件而进行所有这些操作

答案 2 :(得分: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数据。

希望这有帮助。 : - )