summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files/js/file-upload.js62
1 files changed, 50 insertions, 12 deletions
diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js
index 9f51f05d561..793c9672c3f 100644
--- a/apps/files/js/file-upload.js
+++ b/apps/files/js/file-upload.js
@@ -322,26 +322,32 @@ OC.FileUpload.prototype = {
);
},
+ _delete: function() {
+ if (this.data.isChunked) {
+ this._deleteChunkFolder()
+ }
+ this.deleteUpload();
+ },
+
/**
* Abort the upload
*/
abort: function() {
- if (this.data.isChunked) {
- this._deleteChunkFolder();
+ 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 +685,26 @@ 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;
+ // mark as deleted for the progress bar
+ this._uploads[uploadId].deleted = true;
+ window.setTimeout(function() {
+ delete self._uploads[uploadId];
+ }, 5000)
+ },
+
+ _activeUploadCount: function() {
+ var count = 0;
+ for (var key in this._uploads) {
+ if (!this._uploads[key].deleted) {
+ count++;
+ }
+ }
+
+ return count;
},
showUploadCancelMessage: _.debounce(function() {
@@ -905,6 +930,7 @@ OC.Uploader.prototype = _.extend({
if ($uploadEl.exists()) {
this.progressBar.on('cancel', function() {
self.cancelUploads();
+ self.showUploadCancelMessage();
});
this.fileUploadParam = {
@@ -1075,6 +1101,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 +1112,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 +1313,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() +
@@ -1298,9 +1332,9 @@ OC.Uploader.prototype = _.extend({
self._pendingUploadDoneCount++;
- upload.done().then(function() {
+ upload.done().always(function() {
self._pendingUploadDoneCount--;
- if (Object.keys(self._uploads).length === 0 && self._pendingUploadDoneCount === 0) {
+ if (self._activeUploadCount() === 0 && self._pendingUploadDoneCount === 0) {
// All the uploads ended and there is no pending
// operation, so hide the progress bar.
// Note that this happens here only with chunked
@@ -1314,9 +1348,13 @@ OC.Uploader.prototype = _.extend({
// hides the progress bar in that case).
self._hideProgressBar();
}
-
+ }).done(function() {
self.trigger('done', e, upload);
}).fail(function(status, response) {
+ if (upload.aborted) {
+ return
+ }
+
var message = response.message;
if (status === 507) {
// not enough space