如何使用带有AngularJS的REST API将blob文件附件上传到SharePoint中的列表项?

时间:2017-01-02 15:01:29

标签: javascript angularjs rest sharepoint file-upload

我正在尝试从HTML表单上传文件,作为SharePoint 2013列表中列表项的附件。

现在,我可以上传每个文件,但只有.txt文件没有损坏,所以只能打开.txt文件。

当用户提交表单时,我有一个具有以下属性的对象: enter image description here

然后在代码中,我有这个来读取这个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 ^

那么可能编码?数据类型规范不正确?我不知道。

我将非常感谢你的帮助。非常感谢您的建议。

1 个答案:

答案 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'
})