我正在尝试从HTML表单上传文件,作为SharePoint 2013列表中列表项的附件。
现在,我可以上传每个文件,但只有.txt文件没有损坏,所以只能打开.txt文件。
然后在代码中,我有这个来读取这个blob数据:
var fileData = null;
// Get a content from url with blob: .......
$http.get(fileInfo.url, {
headers: {
"Accept": "application/xml;odata=verbose",
"X-Requested-With": "XMLHttpRequest",
}
}).then(function (data) {
fileData = data.data;
// Upload a file
$http.post(siteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items(" + itemId + ")/AttachmentFiles/add(FileName='" + fileInfo.name + "')", fileData, {
headers: {
"Accept": "application/json;odata=verbose",
"X-Requested-With": "XMLHttpRequest",
"X-RequestDigest": document.getElementById('__REQUESTDIGEST').value
}
}).then(function (data) {
console.log("OK");
successFunction(data);
}, function (data) {
console.log("NOT OK");
errorFunction(data);
});
}, function (data) {
alert("Error");
});
可能这就是问题的所在。当用户上传.txt文件时,fileData变量的字符串与该.txt文件中的字符串完全相同。但是如果用户上传.docx文件(MS Word),fileData变量中的字符串就是这样(只是开头):
PK!ߤ lZ[Content_Types].xml ( n 0E Ub袪* > -R {V Ǽ QU ↵l“% 3 3Vƃ ƃ l w% = ^ i7 + -d& 0 A 6 l4 L60# Ò S↵O X * V $ Z33%p)O ^
那么可能编码?数据类型规范不正确?我不知道。
我将非常感谢你的帮助。非常感谢您的建议。
答案 0 :(得分:0)
要使其正常运行,您需要为 responseType: "arraybuffer"
和GET
这两个请求指定POST
:
$http.get(fileInfo.url, {
responseType: "arraybuffer",
headers: {
"Accept": "application/xml;odata=verbose",
"X-Requested-With": "XMLHttpRequest",
}
})
然后POST
请求集Content-Type
未定义并覆盖transformRequest
属性,因此Angular不会将您的数组编码为Json
$http.post(siteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items(" + itemId + ")/AttachmentFiles/add(FileName='" + fileInfo.name + "')", fileData, {
headers: {
"Accept": "application/json;odata=verbose",
"Content-Type": undefined,
"X-Requested-With": "XMLHttpRequest",
"X-RequestDigest": document.getElementById('__REQUESTDIGEST').value
},
transformRequest: angular.identity,
responseType: 'arraybuffer'
})