diff --git a/lib/FileAPI.XHR.js b/lib/FileAPI.XHR.js index 88f3bcbf..bb84a9fb 100644 --- a/lib/FileAPI.XHR.js +++ b/lib/FileAPI.XHR.js @@ -158,7 +158,7 @@ if ( options._chunked ) { // chunked upload if( xhr.upload ){ - xhr.upload.addEventListener('progress', function (/**Event*/evt){ + xhr.upload.addEventListener('progress', api.throttle(function (/**Event*/evt){ if (!data.retry) { // show progress only for correct chunk uploads options.progress({ @@ -168,7 +168,7 @@ , totalSize: data.size }, _this, options); } - }, false); + }, 100), false); } xhr.onreadystatechange = function (){ @@ -204,6 +204,9 @@ data.end = lkb; } else { data.end = data.start - 1; + if (416 == xhr.status) { + data.end = data.end - options.chunkSize; + } } setTimeout(function () { @@ -237,6 +240,9 @@ } } xhr = null; + if (slice) { + slice = null; + } } }; @@ -246,13 +252,20 @@ var slice; (slice = 'slice') in data.file || (slice = 'mozSlice') in data.file || (slice = 'webkitSlice') in data.file; - xhr.setRequestHeader("Content-Range", "bytes " + data.start + "-" + data.end + "/" + data.size); - xhr.setRequestHeader("Content-Disposition", 'attachment; filename=' + encodeURIComponent(data.name)); - xhr.setRequestHeader("Content-Type", data.type || "application/octet-stream"); - - slice = data.file[slice](data.start, data.end + 1); - - xhr.send(slice); + slice = data.file[slice](data.start, data.end + 1); + + if (data.size && !slice.size) { + setTimeout(function () { + _this.end(-1); + }) + } else { + xhr.setRequestHeader("Content-Range", "bytes " + data.start + "-" + data.end + "/" + data.size); + xhr.setRequestHeader("Content-Disposition", 'attachment; filename=' + encodeURIComponent(data.name)); + xhr.setRequestHeader("Content-Type", data.type || "application/octet-stream"); + + xhr.send(slice); + } + slice = null; } else { // single piece upload