如何在Sharepoint 2013中使用Rest API和javascript在站点和子站点之间复制文件

如何在Sharepoint 2013中使用Rest API和javascript在站点和子站点之间复制文件,javascript,rest,sharepoint-2013,Javascript,Rest,Sharepoint 2013,我需要在文档库之间复制文件。图书馆A位于一个站点,图书馆B位于子站点。我知道如何在同一级别的库之间复制文件,但问题是在不同级别之间复制 我用来在同一级别的库之间复制文件的代码 $.ajax({ url : "http://xxx/PWA/_api/web/folders/GetByUrl('/PWA/CopyFromLibrary')/Files/getbyurl('Import.csv')/copyTo(strNewUrl = '/PWA/TargetLibrary/Import.

我需要在文档库之间复制文件。图书馆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)",
但它不起作用。
如何解决这个问题?

您会遇到什么样的错误

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

见: 和 (写入Sharepoint部分)

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


今天刚刚为跨站点解决方案解决了这个问题。诀窍是——不要使用$.ajax下载文档。使用好的旧XMLHttpRequest。原因是JQuery不允许您从SharePoint获取原始二进制数据数组。但是,XMLHttpRequest之所以会这样做,是因为它允许您在其实现中获取arraybuffer,SharePoint接受它

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

  • sourceSite是一个sharepoint网站,适合附加“\u api”rest端点
  • 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();
    }
    

对于后期操作,我们需要请求摘要值,SharePoint使用该值主要对GET操作不需要的后期、删除、更新进行身份验证, 用于post操作的示例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);
        }
    });

您可以尝试使用以下代码在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>

var dt=新日期();
var val_ue=dt.getDate()+“”+dt.getHours()+“”+dt.getMinutes()+“”+dt.getSeconds()+“1”;
var url1=“/”api/web/getfilebyserverrelativeurl('/Lists/Document\u Mapping/Attachments/1/9.jpg')”;
var url2=“/Lists/AddressVersioning/Attachments/84/”;
var组合=”;
var-app=angular.module('myapp',[]);
变量_头={
“X-RequestDigest”:document.getElementById(“\uu RequestDigest”).value,
“接受”:“应用程序/json;odata=verbose”
};
app.controller('mycont',函数($scope,$http){
$scope.myclick=function(){
组合=url1+“/copyTo(“+url2+val_ue+”.jpg”);
$http({method:'POST',url:combined,headers:_headers})(
功能(响应){
控制台日志(“hi”);
val_ue+=1;
},
函数(错误){
日志(“错误:”);
console.log(错误);
},
职能(过程){
console.log(“进程:”);
控制台日志(进程);
}
);
}
});
var x=函数(){
组合=url1+“/copyTo(“+url2+val_ue+”.jpg”);
$.ajax({
网址:合并,
方法:“POST”,
标题:{
“接受”:“application/json;odata=verbose”,
“X-RequestDigest”:$(“#u-RequestDigest”).val()
},
成功:函数(){
警报(“成功!您的文件复制正确”);
val_ue+=1;
},
错误:函数(){
警告(“复制问题”);
}
});
}

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

谢谢它起作用了!!!:)。我一直在搜索:).1如果requestDigest的值是$(“#u requestDigest”)。val()应该用什么语法来获得具有正确值的requestDigest?它不能处理文档的所有属性,有什么解决方法吗?