好的,所以我尝试读取这样的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
答案 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)
您的请求中存在两个问题。
因此,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;
}
应为data
或new DataView(data)
等
因此,您应该在请求中添加new Uint8Array(data)
属性。
示例:
transformRequest: []