• SharePoint REST API


    博客地址:http://blog.csdn.net/FoxDave

    本篇主要通过两个代码示例来展示如何应用REST API和jQuery上传文件到SharePoint。

    示例会使用REST接口和jQuery AJAX请求来将一个本地文件添加到SharePoint文档库并修改它的一些属性。主要有以下几个操作步骤:

    1. 使用FileReader API将本地文件转换成数组(需要HTML5支持),jQuery的(document).ready函数会检查浏览器对FileReader API的支持情况。

    2. 使用文件夹的文件集合对象的Add方法将文件添加到文档库,将数组缓冲放到POST请求的body里。本文介绍的示例会使用getfolderbyserverrelativeurl端点来获取文件集合对象,如果不用这个,你也可以使用列表端点如…/_api/web/lists/getbytitle('<list title>')/rootfolder/files/add。

    3. 使用ListItemAllFields属性来获取与上传文件相对应的列表项。

    4. 使用MERGE请求来更改列表项的标题和显示名。

    运行代码示例

    本文中的两个代码示例使用REST API和jQuery AJAX请求来上传文件到文档库,然后更改对应列表项的属性。第一个例子使用SP.AppContextSite来跨SharePoint域进行调用,就像SharePoint承载的Add-in在上传文件到承载它的网站时做的那样。另一个例子是在同域调用的,就像上传到Add-in所在的网站时做的那样。

    注意用JavaScript编写的提供程序承载的Add-in必须使用SP.RequestExecutor跨域库来向SharePoint域发送请求。

    使用本文提到的示例,你需要做以下事情:

    1. 首先你要有SharePoint Server 2013、2016或者是Online的环境。

    2. 执行代码的用户需要有对文档库的写权限,如果你开发的是一个SharePoint Add-in的话,你可以在列表范围指定写权限。

    3. 支持FileReader API(HTML5)的浏览器。

    4. 在你的页面中引用jQuery库,例如:

    <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"></script>
    5. 在你的页面中添加以下控件:

    <input id="getFile" type="file"/><br />
      <input id="displayName" type="text" value="Enter a unique name" /><br />
      <input id="addFileButton" type="button" value="Upload" onclick="uploadFile()"/>
    代码示例一:使用REST API和jQuery跨SharePoint域上传文件

    大师傅下面的代码示例将文件上传到承载SharePoint Add-in的SharePoint网站。

    'use strict';
    
    var appWebUrl, hostWebUrl;
    
    jQuery(document).ready(function () {
    
        // Check for FileReader API (HTML5) support.
        if (!window.FileReader) {
            alert('This browser does not support the FileReader API.');
        }
    
        // Get the add-in web and host web URLs.
        appWebUrl = decodeURIComponent(getQueryStringParameter("SPAppWebUrl"));
        hostWebUrl = decodeURIComponent(getQueryStringParameter("SPHostUrl"));
    });
    
    // Upload the file.
    // You can upload files up to 2 GB with the REST API.
    function uploadFile() {
    
        // Define the folder path for this example.
        var serverRelativeUrlToFolder = '/shared documents';
    
        // Get test values from the file input and text input page controls.
        // The display name must be unique every time you run the example.
        var fileInput = jQuery('#getFile');
        var newName = jQuery('#displayName').val();
    
        // Initiate method calls using jQuery promises.
        // Get the local file as an array buffer.
        var getFile = getFileBuffer();
        getFile.done(function (arrayBuffer) {
    
            // Add the file to the SharePoint folder.
            var addFile = addFileToFolder(arrayBuffer);
            addFile.done(function (file, status, xhr) {
    
                // Get the list item that corresponds to the uploaded file.
                var getItem = getListItem(file.d.ListItemAllFields.__deferred.uri);
                getItem.done(function (listItem, status, xhr) {
    
                    // Change the display name and title of the list item.
                    var changeItem = updateListItem(listItem.d.__metadata);
                    changeItem.done(function (data, status, xhr) {
                        alert('file uploaded and updated');
                    });
                    changeItem.fail(onError);
                });
                getItem.fail(onError);
            });
            addFile.fail(onError);
        });
        getFile.fail(onError);
    
        // Get the local file as an array buffer.
        function getFileBuffer() {
            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(fileInput[0].files[0]);
            return deferred.promise();
        }
    
        // Add the file to the file collection in the Shared Documents folder.
        function addFileToFolder(arrayBuffer) {
    
            // Get the file name from the file input control on the page.
            var parts = fileInput[0].value.split('\');
            var fileName = parts[parts.length - 1];
    
            // Construct the endpoint.
            var fileCollectionEndpoint = String.format(
                "{0}/_api/sp.appcontextsite(@target)/web/getfolderbyserverrelativeurl('{1}')/files" +
                "/add(overwrite=true, url='{2}')?@target='{3}'",
                appWebUrl, serverRelativeUrlToFolder, fileName, hostWebUrl);
    
            // Send the request and return the response.
            // This call returns the SharePoint file.
            return jQuery.ajax({
                url: fileCollectionEndpoint,
                type: "POST",
                data: arrayBuffer,
                processData: false,
                headers: {
                    "accept": "application/json;odata=verbose",
                    "X-RequestDigest": jQuery("#__REQUESTDIGEST").val(),
                    "content-length": arrayBuffer.byteLength
                }
            });
        }
    
        // Get the list item that corresponds to the file by calling the file's ListItemAllFields property.
        function getListItem(fileListItemUri) {
    
            // Construct the endpoint.
            // The list item URI uses the host web, but the cross-domain call is sent to the
            // add-in web and specifies the host web as the context site.
            fileListItemUri = fileListItemUri.replace(hostWebUrl, '{0}');
            fileListItemUri = fileListItemUri.replace('_api/Web', '_api/sp.appcontextsite(@target)/web');
            
            var listItemAllFieldsEndpoint = String.format(fileListItemUri + "?@target='{1}'",
                appWebUrl, hostWebUrl);
    
            // Send the request and return the response.
            return jQuery.ajax({
                url: listItemAllFieldsEndpoint,
                type: "GET",
                headers: { "accept": "application/json;odata=verbose" }
            });
        }
    
        // Change the display name and title of the list item.
        function updateListItem(itemMetadata) {
    
            // Construct the endpoint.
            // Specify the host web as the context site.
            var listItemUri = itemMetadata.uri.replace('_api/Web', '_api/sp.appcontextsite(@target)/web');
            var listItemEndpoint = String.format(listItemUri + "?@target='{0}'", hostWebUrl);
    
            // Define the list item changes. Use the FileLeafRef property to change the display name. 
            // For simplicity, also use the name as the title.
            // The example gets the list item type from the item's metadata, but you can also get it from the
            // ListItemEntityTypeFullName property of the list.
            var body = String.format("{{'__metadata':{{'type':'{0}'}},'FileLeafRef':'{1}','Title':'{2}'}}",
                itemMetadata.type, newName, newName);
    
            // Send the request and return the promise.
            // This call does not return response content from the server.
            return jQuery.ajax({
                url: listItemEndpoint,
                type: "POST",
                data: body,
                headers: {
                    "X-RequestDigest": jQuery("#__REQUESTDIGEST").val(),
                    "content-type": "application/json;odata=verbose",
                    "content-length": body.length,
                    "IF-MATCH": itemMetadata.etag,
                    "X-HTTP-Method": "MERGE"
                }
            });
        }
    }
    
    // Display error messages. 
    function onError(error) {
        alert(error.responseText);
    }
    
    // Get parameters from the query string.
    // For production purposes you may want to use a library to handle the query string.
    function getQueryStringParameter(paramToRetrieve) {
        var params = document.URL.split("?")[1].split("&");
        for (var i = 0; i < params.length; i = i + 1) {
            var singleParam = params[i].split("=");
            if (singleParam[0] == paramToRetrieve) return singleParam[1];
        }
    }
    代码示例二:使用REST API和jQuery将文件上传到同域网站
    'use strict';
    
    jQuery(document).ready(function () {
    
        // Check for FileReader API (HTML5) support.
        if (!window.FileReader) {
            alert('This browser does not support the FileReader API.');
        }
    });
    
    // Upload the file.
    // You can upload files up to 2 GB with the REST API.
    function uploadFile() {
    
        // Define the folder path for this example.
        var serverRelativeUrlToFolder = '/shared documents';
    
        // Get test values from the file input and text input page controls.
        var fileInput = jQuery('#getFile');
        var newName = jQuery('#displayName').val();
    
        // Get the server URL.
        var serverUrl = _spPageContextInfo.webAbsoluteUrl;
    
        // Initiate method calls using jQuery promises.
        // Get the local file as an array buffer.
        var getFile = getFileBuffer();
        getFile.done(function (arrayBuffer) {
    
            // Add the file to the SharePoint folder.
            var addFile = addFileToFolder(arrayBuffer);
            addFile.done(function (file, status, xhr) {
    
                // Get the list item that corresponds to the uploaded file.
                var getItem = getListItem(file.d.ListItemAllFields.__deferred.uri);
                getItem.done(function (listItem, status, xhr) {
    
                    // Change the display name and title of the list item.
                    var changeItem = updateListItem(listItem.d.__metadata);
                    changeItem.done(function (data, status, xhr) {
                        alert('file uploaded and updated');
                    });
                    changeItem.fail(onError);
                });
                getItem.fail(onError);
            });
            addFile.fail(onError);
        });
        getFile.fail(onError);
    
        // Get the local file as an array buffer.
        function getFileBuffer() {
            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(fileInput[0].files[0]);
            return deferred.promise();
        }
    
        // Add the file to the file collection in the Shared Documents folder.
        function addFileToFolder(arrayBuffer) {
    
            // Get the file name from the file input control on the page.
            var parts = fileInput[0].value.split('\');
            var fileName = parts[parts.length - 1];
    
            // Construct the endpoint.
            var fileCollectionEndpoint = String.format(
                    "{0}/_api/web/getfolderbyserverrelativeurl('{1}')/files" +
                    "/add(overwrite=true, url='{2}')",
                    serverUrl, 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,
                headers: {
                    "accept": "application/json;odata=verbose",
                    "X-RequestDigest": jQuery("#__REQUESTDIGEST").val(),
                    "content-length": arrayBuffer.byteLength
                }
            });
        }
    
        // Get the list item that corresponds to the file by calling the file's ListItemAllFields property.
        function getListItem(fileListItemUri) {
    
            // Send the request and return the response.
            return jQuery.ajax({
                url: fileListItemUri,
                type: "GET",
                headers: { "accept": "application/json;odata=verbose" }
            });
        }
    
        // Change the display name and title of the list item.
        function updateListItem(itemMetadata) {
    
            // Define the list item changes. Use the FileLeafRef property to change the display name. 
            // For simplicity, also use the name as the title. 
            // The example gets the list item type from the item's metadata, but you can also get it from the
            // ListItemEntityTypeFullName property of the list.
            var body = String.format("{{'__metadata':{{'type':'{0}'}},'FileLeafRef':'{1}','Title':'{2}'}}",
                itemMetadata.type, newName, newName);
    
            // Send the request and return the promise.
            // This call does not return response content from the server.
            return jQuery.ajax({
                url: itemMetadata.uri,
                type: "POST",
                data: body,
                headers: {
                    "X-RequestDigest": jQuery("#__REQUESTDIGEST").val(),
                    "content-type": "application/json;odata=verbose",
                    "content-length": body.length,
                    "IF-MATCH": itemMetadata.etag,
                    "X-HTTP-Method": "MERGE"
                }
            });
        }
    }
    
    // Display error messages. 
    function onError(error) {
        alert(error.responseText);
    }
    本篇就到这里。
  • 相关阅读:
    CF1515G
    杂题
    ARC120E
    CF1528F
    ICPC2021银川C
    gym102129F
    杂记6.15
    杂记5.12
    杂记4.1
    杂记3.17
  • 原文地址:https://www.cnblogs.com/justinliu/p/7703743.html
Copyright © 2020-2023  润新知