AngularJS:将ArrayBuffer中的二进制数据PUT到服务器

时间:2014-08-06 05:14:11

标签: javascript angularjs

好的,所以我尝试读取这样的PDF文件:

reader.readAsArrayBuffer(file);

然后尝试使用$http将其发送到服务器,如下所示:

$http.put(url, data, {headers: {'Content-Type': 'application/pdf'}});

所以,请阅读&以原始形式将二进制文件发送到服务器。根据我发现的一些资源,将ArrayBuffer传递给XHR 工作,但将其作为数据传递给$http只会产生这样的请求body{}Content-Length=2

读取文件readAsBinaryString()会导致文件损坏(由于这个原因,显然已弃用)

用例对我来说似乎微不足道,我错过了什么?

Chrome 36,Angular 1.2.20

3 个答案:

答案 0 :(得分:30)

您必须使用reader.readAsArrayBuffer(file);然后在onload回调中从结果中创建ArrayBufferView

new Uint8Array(reader.result)

将该数据传递给$http并覆盖transformRequest属性,以便angularjs不会将您的数组编码为json:

reader.onload = function() {
    $http({
        method: 'PUT', 
        headers: {'Content-Type': 'application/pdf'}, 
        data: new Uint8Array(reader.result), 
        transformRequest: []
    })
};
reader.readAsArrayBuffer(file);

答案 1 :(得分:1)

是不是因为您只是将$ http方法交给数组缓冲区而不是将该缓冲区写入字节数组?如果是这样,你发布到服务器的内容可能就是arraybuffer对象。

查看这篇文章,了解如何将ArrayBuffer写入字节数组: How do I read binary data to a byte array in Javascript?

答案 2 :(得分:0)

您的请求中存在两个问题。

  1. 您需要为$ http函数提供数据视图。
  2. 因此,private int CmbIdxFindByValue(string text, ComboBox cmbCd) { int c = 0; DataTable dtx = (DataTable)cmbCd.DataSource; if (dtx != null) { foreach (DataRow dx in dtx.Rows) { if (dx[cmbCd.ValueMember.ToString()].ToString() == text) return c; c++; } return -1; } else return -1; } 应为datanew DataView(data)

    1. $ http总是尝试以json的形式发送数据。如果覆盖转换函数,则可以阻止此操作。 transform函数是负责将二进制文件转换为json的代理。
    2. 因此,您应该在请求中添加new Uint8Array(data)属性。

      示例:

      transformRequest: []