Как отменить загрузку, начатую с BlobService.createBlockBlobFromBrowserFile?
Я использую клиентскую библиотеку хранилища Microsoft Azure BlobService.createBlockBlobFromBrowserFile
разрешить пользователям загружать файлы в контейнер хранилища Azure. Я хотел бы предоставить им возможность отменить текущую загрузку, например, если она большая и занимает слишком много времени, или они выбрали неправильный файл. Есть ли способ сделать это? Я не вижу ничего очевидного в API.
Мой код основан на этих примерах, например
var file = document.getElementById('fileinput').files[0];
var customBlockSize = file.size > 1024 * 1024 * 32 ? 1024 * 1024 * 4 : 1024 * 512;
blobService.singleBlobPutThresholdInBytes = customBlockSize;
var finishedOrError = false;
var speedSummary = blobService.createBlockBlobFromBrowserFile('mycontainer', file.name, file, {blockSize : customBlockSize}, function(error, result, response) {
finishedOrError = true;
if (error) {
// Upload blob failed
} else {
// Upload successfully
}
});
refreshProgress();
SpeedSummary
объект вернулся из createBlockBlobFromBrowserFile
Я думаю, что этот, который не имеет ничего доступного.
Также спросили на MSDN здесь.
1 ответ
MSDN направил меня к этой проблеме GitHub, обсуждая тот же вопрос и используя собственный фильтр в качестве решения.
Итак, вот моя первая попытка фильтра, который позволяет отменить текущую загрузку. Это, конечно, не идеально, но, похоже, работает в моем элементарном тестировании. Я хотел бы получить обратную связь от людей, действительно знакомых с этим. Это правильный способ отменить, то есть просто вернуться из-за обратного вызова?
Я не проверял его с другими применяемыми фильтрами, например, с повторным фильтром. Также предполагается, что у вас есть только одна загрузка: он не сбрасывает свое состояние и не ожидает нескольких загрузок.
// Filter allowing us to cancel an in-progress upload by setting 'cancel' to true.
// This doesn't cancel file chunks currently being uploaded, so the upload does continue
// for a while after this is triggered. If the last chunks have already been sent the
// upload might actually complete (??)
// See http://azure.github.io/azure-storage-node/StorageServiceClient.html#withFilter
var cancelUploadFilter = {
cancel: false, // Set to true to cancel an in-progress upload
loggingOn: true, // Set to true to see info on console
onCancelComplete: null, // Set to a function you want called when a cancelled request is (probably?) complete,
// i.e. when returnCounter==nextCounter. Because when you cancel an upload it can be many
// seconds before the in-progress chunks complete.
// Internal from here down
nextCounter: 0, // Increments each time next() is called. a.k.a. 'SentChunks' ?
returnCounter: 0, // Increments each time next()'s callback function is called. a.k.a. 'ReceivedChunks'?
handle: function (requestOptions, next) {
var self = this;
if (self.cancel) {
self.log('cancelling before chunk sent');
return;
}
if (next) {
self.nextCounter++;
next(requestOptions, function (returnObject, finalCallback, nextPostCallback) {
self.returnCounter++;
if (self.cancel) {
self.log('cancelling after chunk received');
if (self.nextCounter == self.returnCounter && self.onCancelComplete) {
self.onCancelComplete();
}
// REALLY ??? Is this the right way to stop the upload?
return;
}
if (nextPostCallback) {
nextPostCallback(returnObject);
} else if (finalCallback) {
finalCallback(returnObject);
}
});
}
},
log: function (msg) {
if (this.loggingOn) {
console.log('cancelUploadFilter: ' + msg + ' nc: ' + this.nextCounter + ', rc: ' + this.returnCounter);
}
},
};
Вы бы использовали его при создании службы BLOB-объектов, например:
var blobService = azure.createBlobService().withFilter(cancelUploadFilter);
Затем, если у вас идет загрузка, вы отменяете это так:
cancelUploadFilter.cancel = true;
// optional: if you want to know when all in-progress chunks have stopped:
cancelUploadFilter.onCancelComplete = function () { console.log('Cancelling complete'); };