如何在Sharepoint 2013中使用Rest API和javascript在站点和子站点之间复制文件
我需要在文档库之间复制文件。图书馆A位于一个站点,图书馆B位于子站点。我知道如何在同一级别的库之间复制文件,但问题是在不同级别之间复制 我用来在同一级别的库之间复制文件的代码如何在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.
$.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是文档的文件名
- targetSite、targetFolderPath和targetFileName是镜像或源,仅用于目标
- 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(); }
$.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?它不能处理文档的所有属性,有什么解决方法吗?