Javascript 使用XHR在WebKit/Chrome中上载二进制字符串(相当于Firefox的sendAsBinary)

Javascript 使用XHR在WebKit/Chrome中上载二进制字符串(相当于Firefox的sendAsBinary),javascript,upload,binary,xmlhttprequest,Javascript,Upload,Binary,Xmlhttprequest,我正在开发一个webapp,它使用了几个最前沿的WebKit功能。它基本上是这样做的:使用FileReader读取本地文件,使用JavaScript解压库将每个文件解压为字符串,并使用XMLHttpRequest发布每个文件。这对文本文件非常有效,但不幸的是它会损坏二进制文件(在本例中为图像)。Firefox有一个sendAsBinary方法可以解决这个问题,但它是非标准的,更重要的是,它不适用于WebKit/Chrome,我们依赖它来实现其他功能 有很多变通方法,但到目前为止,没有一种适合我:

我正在开发一个webapp,它使用了几个最前沿的WebKit功能。它基本上是这样做的:使用
FileReader
读取本地文件,使用JavaScript解压库将每个文件解压为字符串,并使用XMLHttpRequest发布每个文件。这对文本文件非常有效,但不幸的是它会损坏二进制文件(在本例中为图像)。Firefox有一个
sendAsBinary
方法可以解决这个问题,但它是非标准的,更重要的是,它不适用于WebKit/Chrome,我们依赖它来实现其他功能

有很多变通方法,但到目前为止,没有一种适合我:

  • 在长字符串()中模拟具有标题、边界等的文件上载请求
  • 在xhr对象()上设置一组标题
  • 使用
    BlobBuilder
    ,将字符串附加到生成器,并使用
    getBlob
    获取要上载的blob(在Chrome发布线程中)

最重要的是,我正在寻找一个向前兼容的解决方案。谢谢

您可以使用base64对其进行编码,然后在服务器上对其进行解码。

我也遇到了同样的问题

这一个对我有用:

XMLHttpRequest.prototype.sendAsBinary = function(datastr) {
    function byteValue(x) {
        return x.charCodeAt(0) & 0xff;
    }
    var ords = Array.prototype.map.call(datastr, byteValue);
    var ui8a = new Uint8Array(ords);
    this.send(ui8a.buffer);
}

检查此处:

如果您可以轻松访问请求的服务器。我尝试从我的域访问couchdb(允许CORS)以将附件放在doc()上。我会试试塞巴斯蒂安的把戏。