4

我需要在文档库之间复制文件。图书馆 A 位于一个站点,图书馆 B 位于子站点。我知道如何在同一级别的库之间复制文件,但问题在于不同级别之间的复制。

我用来在同一级别的库之间复制文件的代码。

 $.ajax({
     url : "http://xxx/PWA/_api/web/folders/GetByUrl('/PWA/CopyFromLibrary')/Files/getbyurl('Import.csv')/copyTo(strNewUrl = '/PWA/TargetLibrary/Import.csv',bOverWrite = true)",

method: 'POST',
    headers: {
        "Accept": "application/json; odata=verbose",
        "X-RequestDigest":  $("#__REQUESTDIGEST").val()
    },
    success: function () {
        alert("Success! Your file was copied properly");
    },
    error: function () {
        alert("Problem with copying");
    }
    });

对于不同的级别,我只使用另一个目标 URL:

url : "http://xxx/PWA/_api/web/folders/GetByUrl('/PWA/CopyFromLibrary')/Files/getbyurl('Import.csv')/copyTo(strNewUrl = '/PWA/Subsite/TargetLibrary/Import.csv',bOverWrite = true)",

它不起作用。如何解决这个问题?

4

5 回答 5

2

今天刚刚为跨站点解决方案解决了这个问题。诀窍是——不要使用 $.ajax 来下载文档。使用良好的旧 XMLHttpRequest。原因是 JQuery 根本不允许您从 SharePoint 获取原始二进制数据数组。但是,XMLHttpRequest 之所以这样做,是因为它允许您将数组缓冲区作为其实现的一部分,SharePoint 接受!

以下是包含用于构建完整源和目标 REST url 的部分的代码。请注意,您可以使用 $.ajax 上传文件。

  • sourceSite是一个适合附加“_api”休息端点的共享点站点
  • sourceFolderPath是您的文档所在的相对文件夹路径
  • sourceFileName是文档的文件名
  • targetSitetargetFolderPathtargetFileName是镜像或源,仅用于目标。
  • requestDigest是 SharePoint 接受更新所需的特殊值。

    function copyDocument(sourceSite, sourceFolderPath, sourceFileName, targetSite, targetFolderPath, targetFileName, requestDigest) {
    
        var sourceSiteUrl = sourceSite + "_api/web/GetFolderByServerRelativeUrl('" + sourceFolderPath + "')/Files('" + sourceFileName + "')/$value";
        var targetSiteUrl = targetSite + "_api/web/GetFolderByServerRelativeUrl('" + targetFolderPath + "')/Files/Add(url='" + targetFileName + "',overwrite=true)";
    
        var xhr = new XMLHttpRequest();
        xhr.open('GET', sourceSiteUrl, true);
        xhr.setRequestHeader('binaryStringResponseBody', true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function (e) {
            if (this.status == 200) {
                var arrayBuffer = this.response;
                $.ajax({
                    url: targetSiteUrl,
                    method: 'POST',
                    data: arrayBuffer,
                    processData: false,
                    headers: { 'binaryStringRequestBody': 'true', 'Accept': 'application/json;odata=verbose;charset=utf-8', 'X-RequestDigest': requestDigest }
                })
                .done(function (postData) {
                console.log('we did it!');
                })
                .fail(function (jqXHR, errorText) {
                console.log('dadgummit');
            });
            }
        }
        xhr.send();
    }
    
于 2016-08-12T21:41:09.670 回答
1

注意文件移动操作仅在给定文档库的范围内起作用。您不能在文档库之间复制。

http://msdn.microsoft.com/en-us/library/office/dn605900(v=office.15).aspx#Folder6

于 2014-04-17T14:23:01.087 回答
1

你得到什么样的错误?

您的问题的一个可能原因是您的 RequestDigest 与您要发布文件的位置不匹配,因为它是从运行代码的页面获取的。通过在目标位置调用“_api/contextinfo”来获取匹配的 RequestDigest。

请参阅:http: //blogs.breeze.net/mickb/2012/11/20/SP2013GettingAFormDigestForUpdateRESTCalls.aspxhttp://msdn.microsoft.com/en-us/magazine/dn198245.aspx(写入 Sharepoint 部分)

于 2013-06-19T09:03:49.937 回答
0

您可以尝试使用以下代码将文件从 SharePoint 中的一个位置复制到另一个位置。

以下示例将有助于在 SharePoint 沙箱中复制文件。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<div ng-app="myapp" ng-controller="mycont">
    <input type="button" ng-click = "myclick()" value="Angular File Copy" />    
</div>

<input type=button onclick="x()"  value="jQueryFile copy" />
<script>
    var dt =new Date();
    var val_ue = dt.getDate()+""+dt.getHours()+""+dt.getMinutes()+""+dt.getSeconds() +"1" ;
    var url1 = "/_api/web/getfilebyserverrelativeurl('/Lists/Document_Mapping/Attachments/1/9.jpg')";
    var url2 = "/Lists/AddressVersioning/Attachments/84/" ;
    var combined = "";
    var app = angular.module('myapp',[]);
    var _headers = {
        'X-RequestDigest': document.getElementById("__REQUESTDIGEST").value,
        'accept':'application/json;odata=verbose'
    };
    app.controller('mycont',function($scope,$http){
        $scope.myclick =  function(){
            combined = url1 + "/copyTo('" + url2 + val_ue + ".jpg')";
            $http({method:'POST',url:combined,headers:_headers}).then(
                function(response){
                    console.log("hi");
                    val_ue += 1;
                },
                function(error){
                    console.log("Error:");
                    console.log(error);
                },
                function(process){
                    console.log("process:");
                    console.log(process);
                }
            );
        }
    });
    var x = function(){
        combined = url1 + "/copyTo('" + url2 + val_ue + ".jpg')";
        $.ajax({
            url : combined,
            method: 'POST',
            headers: {
                "Accept": "application/json; odata=verbose",
                "X-RequestDigest":  $("#__REQUESTDIGEST").val()
            },
            success: function () {
                alert("Success! Your file was copied properly");
                val_ue +=1;
            },
            error: function () {
                alert("Problem with copying");
            }
        });
    }
</script>

注意:如果列表项是新创建的,上述功能将不起作用。但是对于所有其他情况,它都可以工作(甚至将一个文档库形成另一个文档库或跨站点/站点集合)

于 2018-02-09T13:28:16.177 回答
0

对于 POST - 操作我们需要请求摘要值,SharePoint 使用该值进行身份验证,主要用于 GET 操作不需要的 Post、Delete、Update,用于发布操作的示例 jquery ajax 代码 -

 $.ajax({
        url: url + "/_api/web/lists/getbytitle('" + listname + "')/items",
        type: "POST",
        contentType: "application/json;odata=verbose",
        data: JSON.stringify(item),
        headers: {
            "Accept": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
        },
        success: function (data) {
            success(data); // Returns the newly created list item information
        },
        error: function (data) {
            failure(data);
        }
    });
于 2017-08-10T09:31:41.950 回答