如何使用CSOM将文件正确上传到文档库?

时间:2017-11-21 09:40:14

标签: javascript soap sharepoint-2010 sharepoint-jsom

我尝试使用FileReader对象将文件上传到文档库,但没有这样做,因为文件是以错误的编码上传的。

这是代码

$("#file").kendoUpload({
    async: {
        saveUrl: "save",
        autoUpload: true
    },
    upload: function (e) {
        $.each(e.files, function () {
            var file = this.rawFile;
            var reader = new FileReader();
            reader.onload = function (e) {
                var data = reader.result;
                var soapEnv =
                    "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='ht
                    <soap:Body>\
                        <CopyIntoItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>\
                            <SourceUrl>" + file.name + "</SourceUrl>\
                                <DestinationUrls>\
                                    <string>"+GetHostname() + folder + "/" + file.name + "</string>\
                                </DestinationUrls>\
                                <Fields>\
                                      <FieldInformation Type='Text' DisplayName='Title' InternalName='Title' Value='"+ file.name + "'  />\
                                </Fields>\
                            <Stream>" +window.btoa(data) + "</Stream>\
                        </CopyIntoItems>\
                    </soap:Body>\
                </soap:Envelope>";
                $.ajax({
                    url: "/documents/_vti_bin/copy.asmx",
                    beforeSend: function (xhr) { xhr.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/CopyIntoItems"); },
                    type: "POST",
                    dataType: "xml",
                    data: soapEnv,
                    contentType: "text/xml; charset=\"utf-8\""
                }).then(function (data, status) {
                    var itemUrl = xmlToJSON(data).Envelope.Body.CopyIntoItemsResponse.Results.CopyResult._DestinationUrl;                           
                    return documentsUtilities.checkIn(itemUrl);
                })
                .then(function(res){
                    //notifiy user and automatically reload the grid
                });
            };
        });
        e.preventDefault();
    }

我面临的问题是肥皂串本身。

将该数据传递为<Stream>" +window.btoa(data) + "</Stream>会导致文件上传,其内容为base64编码。图像为黑色,文本文件不可读。

使用<Stream>" + data + "</Stream>\传递数据对象本身会导致错误的请求。

使用FileReader API将文件上传到SharePoint 2010上的文档库的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

FileReader API结果是一个base64编码的字符串,带有一些开销,指定实际的文件类型。如果pdf文件看起来像这样:

data:application/pdf;base64,JVBERi0xLjQKJdP0zOEKMSAwIG9iago8PAovQ3JlYXRpb25EYXRlKEQ6MjAxNzA5MjcxNTMz....

删除开头的位,包括base64之后的逗号就是让SharePoint满意所需的全部内容:

<Stream>" + data.replace(/^.*base64,/, '') + "</Stream>\

我现在已经在jpg,png,xlsx,docx,pdf和js文件上对此进行了测试。像魅力一样。