diff options
-rw-r--r-- | apps/files/js/file-upload.js | 62 |
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 |