尝试将多个附件上传到我的列表时出现“保存冲突”错误,据我所知,这是因为当新的附件进入时,sharepoint仍在处理最后一个附件。
我认为可以帮助在发送下一个文件之前有某种延迟,但如果所述文件非常大(延迟太短),这也可能失败。
这就是我目前上传附件的方式:
使用promises,$q
var elementPromises = [];
angular.forEach(element.files, function(item){
item = $scope.UploadAttachment(item).then(function(){});
elementPromises.push(item);
});
$q.all(elementPromises).then(function () {
// alert('all attachments saved');
}, function(reason) {
// alert('Failed: ' + reason);
}, function(update) {
//alert('Got notification: ' + update);
});
UploadAttachment功能:
$scope.UploadAttachment = function(file){
var deferred = $q.defer();
setTimeout(function() {
// deferred.notify('Saving attachments..');
readFile(file).done(function (buffer, fileName) {
var saveFile = new Entry(buffer);
saveFile.$upload({ID: ID, filename: fileName}, function(u){
console.log(u);
deferred.resolve('Success');
}, function(error){
console.log(error);
deferred.reject('Error');
});
});
}, 1000);
return deferred.promise;
};
ReadFile
是一个文件阅读器功能,从我获得缓冲区和文件名,这是我上传到SharePoint
的内容。
Entry
中的{p> New Entry (buffer)
是$resource
工厂,并且具有此$upload
功能:
upload: {
url: "serverURL/_api/lists/getByTitle('listName')/items(:ID)/AttachmentFiles/add(FileName=':filename')",
method: "POST",
transformRequest: [],
processData: true,
headers: {
"accept": "application/json;odata=verbose",
"X-RequestDigest": function() {return $("#__REQUESTDIGEST").val()},
"content-length": function () {
return arguments[0].data.byteLength;
}
}
}
正如我所说,这适用于一个文件(或几个小文件),但是当尝试上传多个文件大小时,我遇到了保存冲突错误。
到目前为止,我唯一的想法是某种延迟,但我不知道在哪里或如何实施它,我也担心这还不够,对此有什么看法?
答案 0 :(得分:0)
您需要序列化项目更新和项目文件附件REST调用。下一个呼叫必须在前一个呼叫完成之前触发。您的实现调用并行发生,导致保存冲突。