Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Petry <vincent@nextcloud.com>2022-01-12 13:42:10 +0300
committerVincent Petry <vincent@nextcloud.com>2022-01-12 22:21:12 +0300
commit6c4d4d8bc4abc3f1b3d794da9d90906ccac12607 (patch)
tree7ff8d5c0c1dbdc282ffaf11efa80a81f325a6bcb /apps/files
parent8d813219c016fbec0c722ccb3bb07a1ec10b92cd (diff)
Properly abort uploads
Add a new approach for flagging an upload as aborted because we can't rely on the browser fully cancelling the request as we now seem to receive an error response from the server instead of a jQuery "abort" message. Signed-off-by: Vincent Petry <vincent@nextcloud.com>
Diffstat (limited to 'apps/files')
-rw-r--r--apps/files/js/file-upload.js45
1 files changed, 36 insertions, 9 deletions
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 9f51f05d561..df43135789d 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -322,26 +322,34 @@ OC.FileUpload.prototype = {
);
},
+ _delete: function() {
+ var self = this;
+ if (this.data.isChunked) {
+ this._deleteChunkFolder()
+ }
+ this.deleteUpload();
+ },
+
/**
* Abort the upload
*/
abort: function() {
- if (this.data.isChunked) {
- this._deleteChunkFolder();
+ var self = this;
+ if (this.aborted) {
+ return
}
- this.data.abort();
- this.deleteUpload();
this.aborted = true;
+ this._delete();
},
/**
* Fail the upload
*/
fail: function() {
- this.deleteUpload();
- if (this.data.isChunked) {
- this._deleteChunkFolder();
+ if (this.aborted) {
+ return
}
+ this._delete();
},
/**
@@ -679,7 +687,13 @@ OC.Uploader.prototype = _.extend({
return;
}
- delete this._uploads[upload.data.uploadId];
+ // defer as some calls/chunks might still be busy failing, so we need
+ // the upload info there still
+ var self = this;
+ var uploadId = upload.data.uploadId;
+ window.setTimeout(function() {
+ delete self._uploads[uploadId];
+ }, 5000)
},
showUploadCancelMessage: _.debounce(function() {
@@ -905,6 +919,7 @@ OC.Uploader.prototype = _.extend({
if ($uploadEl.exists()) {
this.progressBar.on('cancel', function() {
self.cancelUploads();
+ self.showUploadCancelMessage();
});
this.fileUploadParam = {
@@ -1075,6 +1090,10 @@ OC.Uploader.prototype = _.extend({
var upload = self.getUpload(data);
var status = null;
if (upload) {
+ if (upload.aborted) {
+ // uploads might fail with errors from the server when aborted
+ return
+ }
status = upload.getResponseStatus();
}
self.log('fail', e, upload);
@@ -1082,7 +1101,7 @@ OC.Uploader.prototype = _.extend({
self.removeUpload(upload);
if (data.textStatus === 'abort' || data.errorThrown === 'abort') {
- self.showUploadCancelMessage();
+ return
} else if (status === 412) {
// file already exists
self.showConflict(upload);
@@ -1283,6 +1302,10 @@ OC.Uploader.prototype = _.extend({
fileupload.on('fileuploadchunksend', function(e, data) {
// modify the request to adjust it to our own chunking
var upload = self.getUpload(data);
+ if (!upload) {
+ // likely cancelled
+ return
+ }
var range = data.contentRange.split(' ')[1];
var chunkId = range.split('/')[0].split('-')[0];
data.url = OC.getRootPath() +
@@ -1317,6 +1340,10 @@ OC.Uploader.prototype = _.extend({
self.trigger('done', e, upload);
}).fail(function(status, response) {
+ if (upload.aborted) {
+ return
+ }
+
var message = response.message;
if (status === 507) {
// not enough space