【问题标题】:Change filename of existing file on SharePoint Document library using REST API使用 REST API 更改 SharePoint 文档库中现有文件的文件名
【发布时间】:2016-01-24 20:56:36
【问题描述】:

我有一个关于如何使用 REST API 更改 SharePoint 文档库中的现有文件的问题。我在http://site url/<RootFolder>/<SubFolder>/File.docx 位置有几个文件。我有一个 UI,它列出了来自这个 subfloder 位置的所有文件。当用户单击编辑时,我将文件名启用为文本框,用户可以在其中更改文件名。

在做了一些研究后,我发现构造一个如下所示的端点:https://<site url>/_api/web/lists/getbytitle('Documents')/items(<item id>) 我们可以编辑文件元数据属性。但我无法找出更新驻留在 SharePoint Doc 库中的现有文档的文件名的最佳方法。

有人可以帮助我使用 REST API 查询来获取文件和更新文件名的方法吗?

【问题讨论】:

    标签: rest sharepoint sharepoint-2013


    【解决方案1】:

    您至少可以考虑两种选择:

    选项 1. 重命名文件名

    您可以更新现有列表项的名称,如下所示

    示例

    function rename(webUrl,listTitle,itemId,fileName){
       var endpointUrl = webUrl + "/_api/web/lists/getbytitle('" + listTitle + "')/items(" + itemId +  ")";
       return executeJson(endpointUrl)
       .then(function(data){                 
          var itemPayload = {};
          itemPayload['__metadata'] = {'type': data.d['__metadata']['type']};
          itemPayload['Title'] = fileName;
          itemPayload['FileLeafRef'] = fileName;
          var itemUrl = data.d['__metadata']['uri'];
          var headers = {};
          headers["X-HTTP-Method"] = "MERGE";
          headers["If-Match"] =  "*";
          return executeJson(itemUrl,"POST",headers,itemPayload);
       });
    }
    
    var webUrl = _spPageContextInfo.webAbsoluteUrl; // web url
    var listTitle = "Documents";  //list title
    var itemId = 1;  //list item id
    var fileName = "SP User Guide.docx"; //new file name
    
    rename(webUrl,listTitle,itemId,fileName)
    .done(function(item){
       console.log('Renamed');
    })
    .fail(function(error){
        console.log(error);
    });
    

    选项 2. 通过MoveTo REST endpoint 移动文件

    示例

    function moveTo(webUrl,sourceFileUrl,targetFileUrl){
       var endpointUrl = webUrl + "/_api/web/getfilebyserverrelativeurl('" + sourceFileUrl + "')/moveto(newurl='" + targetFileUrl + "',flags=1)";
       return executeJson(endpointUrl,"POST");
    }
    
    var webUrl = _spPageContextInfo.webAbsoluteUrl; // web url
    var sourceFileUrl = "/Documents/SP2010.docx";
    var targetFileUrl = "/Documents/SP2013.docx";
    
    moveTo(webUrl,sourceFileUrl,targetFileUrl)
    .done(function(item){
       console.log('Done');
    })
    .fail(function(error){
        console.log(error);
    });
    

    executeJson函数:

    function executeJson(url,method,headers,payload) 
    {
        headers = headers || {};
        method = method || 'GET';
        headers["Accept"] = "application/json;odata=verbose";
        if(method == "POST") {
            headers["X-RequestDigest"] = $("#__REQUESTDIGEST").val();
        }   
    
        var ajaxOptions = 
        {       
           url: url,   
           type: method,  
           contentType: "application/json;odata=verbose",
           headers: headers
        };
        if(method == "POST") {
          ajaxOptions.data = JSON.stringify(payload);
        }  
        return $.ajax(ajaxOptions);
    }
    

    【讨论】:

    • 我在使用方法 2 时遇到问题。我有一个案例,其中有文件 abc.txt,我将其重命名为 abc.txt.old,但如果 abc.txt.old 已经存在,那么这个 API 调用不是合并文件的版本,而是在 API 调用之后覆盖它(新版本是 1.0)。是否有一个标志可以让我在版本中实现合并而不是硬替换?
    • 假设如果现有的 abc.txt.old 有 Exposures 等,它们也会在 MoveTo 完成后消失。
    • 解决方法是什么 { "error": { "code": "-2130575257, Microsoft.SharePoint.SPException", "message": { "lang": "en-US", " value": "指定的名称已被使用。\n\n文档或文件夹名称未更改。要将名称更改为其他值,请关闭此对话框并编辑文档或文件夹的属性。" } } } 我正在使用选项 1。有没有办法合并 2 个文件(新文件与现有文件)?
    【解决方案2】:

    您需要使用 MoveTo 方法来执行此操作,如 MSDN https://msdn.microsoft.com/en-us/library/office/dn450841.aspx#bk_FileMoveTo 中所述。

    executor.executeAsync({
      url: "<app web url>/_api/SP.AppContextSite(@target)/web
        /getfilebyserverrelativeurl('/Shared Documents/filename.docx')
        /moveto(newurl='/Other Folder/filename.docx',flags=1)
        ?@target='<host web url>'",
      method: "POST",
      success: successHandler,
      error: errorHandler
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多