3

SP.RequestExecutor ではなく、ネイティブ JavaScript/jQuery を使用して画像を SharePoint にアップロードしようとしています。

私は認証の問題を見事に簡単に解決したので、バイナリ ファイルをアップロードする方法を理解するだけです。ファイルにプレーンテキストを入れると、問題なくアップロードされますが、問題が発生しているのは単なるバイナリデータです。

これまでの私のコードは以下に含まれています。getToken()それは事であり、使用する有効なダイジェスト オブジェクトを私に残します。*また、ドキュメント ライブラリ名を'sで空白にしたことにも注意してください。

function PerformUpload(fileName, fileData) {    
    getToken();
    $.ajax({
        url: siteFullUrl +
        "/_api/web/GetFolderByServerRelativeUrl('/*****/')/Files" +
        "/Add(url='" + fileName + "', overwrite=true)",
        type: "POST",
        async: false,
        data: fileData,
        processData: false,
        contentType: "application/json;odata=verbose",
        headers: {
            "Accept": "application/json;odata=verbose",
            "X-RequestDigest": digest
        },
        success: function (data) {
            alert("Success");
        },
        error: function (err) {
            alert("Error: \r\n" + JSON.stringify(err));
        }
    });
}

contentType、設定のさまざまな値の組み合わせを多数試しましbinaryStringRequestBody: trueたが、画像が SharePoint に入ったときにまだ破損しています。

ファイルをバイナリに解析する現時点での私のコードは

var reader = new FileReader();
reader.onload = function (result) {
    var fileName = '',
     libraryName = '',
     fileData = '';

    var byteArray = new Uint8Array(result.target.result)
    for (var i = 0; i < byteArray.byteLength; i++) {
        fileData += String.fromCharCode(byteArray[i])
    }
    PerformUpload("image.jpg", fileData);
};
reader.readAsArrayBuffer(fileInput);

ファイルが SharePoint にアップロードされていますが、表示またはダウンロードしようとするとファイルが破損しています。

バイナリ ファイルを SharePoint にアップロードする正しい方法について、誰かがガイダンスを提供できますか? (ajax呼び出しで)data: fileData,ファイルdata: "A simple string",のアップロードに置き換え、ダウンロードするとファイルの内容はA simple string.

4

2 に答える 2

1

SP.RequestExecutor を使用してファイルを SharePoint にアップロードする場合は、ArrayBuffer を文字列に変換する必要があります。この文字列は、POST 操作の本文として設定できます。SP.RequestExecutor で REST を使用して SharePoint にファイルをアップロードする方法については、こちらの詳細を参照してください。

Jquery.Ajax を使用して解析されたファイルをバイナリに使用している場合、画像が SharePoint に入ったときに画像が破損します。また、FileReader オブジェクトは、非同期にロードするためのファイル情報を受け入れることにも注意してください。onload および onerror イベントは、ファイルのロードが成功または失敗したときに発生します。デフォルトで onload イベントの処理を維持し、onloadendイベントで結果を取得する必要があります。

次の記事を試してみましたが、うまくいきました。

方法: REST API と jQuery を使用してファイルをアップロードする

簡単に、これが私が実装した方法です:

var fileInput = jQuery('#getFile');
var file = fileInput[0].files[0];
var serverRelativeUrlToFolder = '*****'; //if the library in subsite, You have to remove the forward slash "/" before the document library relative url. 
proccessUploadUsingJQueryAjax(file, serverRelativeUrlToFolder);

function getFileBuffer(file) {
     var deferred = jQuery.Deferred();
     var reader = new FileReader();
     reader.onloadend = function (e) {
          deferred.resolve(e.target.result);
     }
     reader.onerror = function (e) {
          deferred.reject(e.target.error);
     }
     reader.readAsArrayBuffer(file);
     return deferred.promise();
}
function addFileToFolderUsingJQueryAjax(fileName, arrayBuffer, serverRelativeUrlToFolder) {
       // Construct the endpoint.
        var fileCollectionEndpoint = String.format(
                "{0}/_api/web/GetFolderByServerRelativeUrl('{1}')/files/add(overwrite=true, url='{2}')",
                _spPageContextInfo.webAbsoluteUrl, serverRelativeUrlToFolder, fileName);

        // Send the request and return the response.
        // This call returns the SharePoint file.
        return jQuery.ajax({
            url: fileCollectionEndpoint,
            type: "POST",
            data: arrayBuffer,
            processData: false,
            contentType: "application/json;odata=verbose",
            headers: {
                "accept": "application/json;odata=verbose",
                "X-RequestDigest": jQuery("#__REQUESTDIGEST").val()
            }
        });
    }
function proccessUploadUsingJQueryAjax(file, serverRelativeUrlToFolder){
     var getFile = getFileBuffer(file);
     getFile.done(function (arrayBuffer) {
     // Add the file to the SharePoint folder.
            var addFile = addFileToFolderUsingJQueryAjax("image.jpg", arrayBuffer, serverRelativeUrlToFolder);
            addFile.done(function (file, status, xhr) {
                alert("File Uploaded");
            });
            addFile.fail(function (error) { alert("Error Add File: " + error.responseText); });
        });
     getFile.fail(function (error) { alert("Error Get File: " + error.responseText); });
}

問題が解決したかどうかお知らせください。

于 2014-08-14T06:02:18.720 に答える
0

これをajax設定に追加してみてください

transformRequest: []

これにより、Sharepoint がメタデータをファイルに追加できなくなります。

于 2015-03-16T14:54:05.923 に答える