Я получаю ошибку "save conflict" при попытке загрузить несколько вложений в свой список и, насколько я понимаю, это потому, что sharepoint по-прежнему обрабатывает последнее вложение, когда приходит новый.
То, что, по моему мнению, может помочь, это некоторая задержка перед отправкой в следующий файл, но это также может потерпеть неудачу, если указанный файл очень большой (слишком низкая задержка).
Вот как я загружаю вложения на данный момент:
Используя обещания, $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
- это функция filereader, из которой я получаю буфер и имя файла, это то, что я загружаю в SharePoint
.
Entry
в 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;
}
}
}
Как я уже сказал, это отлично работает для одного файла (или нескольких небольших), но при попытке загрузить несколько файлов с некоторым размером на них я столкнулся с ошибкой ошибки сохранения.
Моя единственная идея до сих пор является некоторой задержкой, но я не знаю, где и как ее реализовать, также я боюсь, что этого будет недостаточно, никаких мыслей об этом?
Вам необходимо выполнить сериализацию вызовов REST и обновления файлов элементов. Следующий вызов не должен запускаться до завершения предыдущего. С вашими реализациями вызовы происходят параллельно, вызывая конфликт сохранения.