Updating jquery-ui uploader to version 4.5.1 + updating css

skala
Julio Montoya 15 years ago
parent 91de900f90
commit 95789342a0
  1. 26
      main/inc/lib/javascript/jquery-upload/README.txt
  2. 88
      main/inc/lib/javascript/jquery-upload/jquery.fileupload-ui.css
  3. 399
      main/inc/lib/javascript/jquery-upload/jquery.fileupload-ui.js
  4. 610
      main/inc/lib/javascript/jquery-upload/jquery.fileupload.js
  5. BIN
      main/inc/lib/javascript/jquery-upload/pbar-ani.gif

@ -5,6 +5,10 @@ Demo
----
http://aquantum-demo.appspot.com/file-upload
Setup instructions
------------------
https://github.com/blueimp/jQuery-File-Upload/wiki/Setup
Features
--------
- Multiple file upload:
@ -12,9 +16,15 @@ Features
- Drag & Drop support:
Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.
- Upload progress bar:
Shows a progress bar indicating the upload progress for individual files.
Shows a progress bar indicating the upload progress for individual files and for all uploads combined.
- Cancelable uploads:
Individual file uploads can be canceled to stop the upload progress.
- Resumable uploads:
Aborted uploads can be resumed with browsers supporting the Blob API.
- Chunked uploads:
Large files can be uploaded in smaller chunks with browsers supporting the Blob API.
- Preview images:
A preview of image files can be displayed before uploading with browsers supporting the required HTML5 APIs.
- No browser plugins (e.g. Adobe Flash) required:
The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.
- Graceful fallback for legacy browsers:
@ -39,13 +49,15 @@ Requirements
Browser Support (tested versions)
---------------------------------
- Google Chrome - 7.0, 8.0, 9.0
- Apple Safari - 5.0 ¹
- Mozilla Firefox - 3.6
- Opera - 10.60 ², 11.00 ²
- Microsoft Internet Explorer 6.0 ², 7.0 ², 8.0 ², 9.0 ²
- Google Chrome - 7.0, 8.0, 9.0, 10.0, 11.0
- Apple Safari - 4.0, 5.0 ¹
- Mozilla Firefox - 3.5, 3.6, 4.0
- Opera - 10.6, 11.0, 11.1 ²
- Microsoft Internet Explorer 6.0, 7.0, 8.0, 9.0 ³
¹ Drag & Drop is not supported on the Windows version of Safari.
² MSIE and Opera have no support for Drag & Drop, multiple file selection or upload progress indication.
² Opera has no suppport for Drag & Drop or upload progress, but support for multiple file selection since version 11.1.
³ MSIE has no support for Drag & Drop, multiple file selection or upload progress.
License
-------

@ -1,74 +1,74 @@
.file_upload {
position: relative;
overflow: hidden;
direction: ltr;
cursor: pointer;
text-align: center;
color: #333;
font-weight: bold;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
width: 500px;
height: 50px;
line-height: 50px;
background: palegreen;
border: 1px solid limegreen;
font-size:120%;
position: relative;
overflow: hidden;
direction: ltr;
cursor: pointer;
text-align: center;
color: #333;
font-weight: bold;
-moz-border-radius: 10px;
-webkit-border-radius: 10px;
border-radius: 10px;
width: 500px;
height: 50px;
line-height: 50px;
background: palegreen;
border: 1px solid limegreen;
font-size:120%;
}
.file_upload_small {
width: 500px;
height: 50px;
line-height: 50px;
font-size: auto;
background: palegreen;
border: 1px solid limegreen;
width: 500px;
height: 50px;
line-height: 50px;
font-size: auto;
background: palegreen;
border: 1px solid limegreen;
}
.file_upload_large {
/*width: 100%;
height: 150px;
line-height: 150px;
background: palegreen;
border: 1px solid limegreen;*/
/*width: 100%;
height: 150px;
line-height: 150px;
background: palegreen;
border: 1px solid limegreen;*/
}
.file_upload_highlight {
background: lawngreen;
background: lawngreen;
}
.file_upload input {
position: absolute;
top: 0;
right: 0;
margin: 0;
border: 300px solid transparent;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
filter: alpha(opacity=0);
-o-transform: translate(-300px, -300px) scale(10);
-moz-transform: translate(-800px, 0) scale(10);
position: absolute;
top: 0;
right: 0;
margin: 0;
border: 300px solid transparent;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
filter: alpha(opacity=0);
-o-transform: translate(-300px, -300px) scale(10);
-moz-transform: translate(-800px, 0) scale(10);
cursor: pointer;
}
.file_upload iframe, .file_upload button {
display: none;
display: none;
}
.file_upload_preview img {
width: 80px;
width: 80px;
}
.file_upload_progress .ui-progressbar-value {
background: url(pbar-ani.gif);
background: url(pbar-ani.gif);
}
.file_upload_progress div {
width: 150px;
height: 15px;
width: 150px;
height: 15px;
}
.file_upload_cancel button {
cursor: pointer;
cursor: pointer;
}

@ -1,58 +1,72 @@
/*
* jQuery File Upload User Interface Plugin 3.6
* jQuery File Upload User Interface Plugin 4.4.1
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Copyright 2010, Sebastian Tschan, AQUANTUM
* Licensed under the MIT license:
* http://creativecommons.org/licenses/MIT/
*
* https://blueimp.net
* http://www.aquantum.de
*/
/*jslint browser: true */
/*global jQuery, FileReader, URL */
/*jslint browser: true, unparam: true */
/*global jQuery, FileReader, URL, webkitURL */
(function ($) {
'use strict';
var undef = 'undefined',
func = 'function',
UploadHandler,
methods,
LocalImage = function (file, imageTypes) {
var img,
fileReader;
if (!imageTypes.test(file.type)) {
return null;
}
img = document.createElement('img');
if (typeof URL !== undef && typeof URL.createObjectURL === func) {
img.src = URL.createObjectURL(file);
img.onload = function () {
URL.revokeObjectURL(this.src);
};
return img;
}
if (typeof FileReader !== undef) {
fileReader = new FileReader();
if (typeof fileReader.readAsDataURL === func) {
fileReader.onload = function (e) {
img.src = e.target.result;
};
fileReader.readAsDataURL(file);
return img;
MultiLoader = function (callBack) {
var loaded = 0,
list = [];
this.complete = function () {
loaded += 1;
if (loaded === list.length + 1) {
// list.length * onComplete + 1 * onLoadAll
callBack(list);
loaded = 0;
list = [];
}
}
return null;
};
this.push = function (item) {
list.push(item);
};
this.getList = function () {
return list;
};
};
UploadHandler = function (container, options) {
var uploadHandler = this,
dragOverTimeout,
isDropZoneEnlarged;
isDropZoneEnlarged,
multiLoader = new MultiLoader(function (list) {
uploadHandler.hideProgressBarAll(function () {
uploadHandler.resetProgressBarAll();
if (typeof uploadHandler.onCompleteAll === func) {
uploadHandler.onCompleteAll(list);
}
});
}),
getUploadTable = function (handler) {
return typeof handler.uploadTable === func ?
handler.uploadTable(handler) : handler.uploadTable;
},
getDownloadTable = function (handler) {
return typeof handler.downloadTable === func ?
handler.downloadTable(handler) : handler.downloadTable;
};
this.requestHeaders = {'Accept': 'application/json, text/javascript, */*; q=0.01'};
this.dropZone = container;
this.imageTypes = /^image\/(gif|jpeg|png)$/;
this.previewMaxWidth = this.previewMaxHeight = 80;
this.previewLoadDelay = 100;
this.previewAsCanvas = true;
this.previewSelector = '.file_upload_preview';
this.progressSelector = '.file_upload_progress div';
this.cancelSelector = '.file_upload_cancel button';
@ -61,20 +75,68 @@
this.cssClassHighlight = 'file_upload_highlight';
this.dropEffect = 'highlight';
this.uploadTable = this.downloadTable = null;
this.buildUploadRow = this.buildDownloadRow = function () {
return null;
this.buildUploadRow = this.buildDownloadRow = null;
this.progressAllNode = null;
this.loadImage = function (file, callBack, maxWidth, maxHeight, imageTypes, noCanvas) {
var img,
scaleImage,
urlAPI,
fileReader;
if (imageTypes && !imageTypes.test(file.type)) {
return null;
}
scaleImage = function (img) {
var canvas = document.createElement('canvas'),
scale = Math.min(
(maxWidth || img.width) / img.width,
(maxHeight || img.height) / img.height
);
if (scale > 1) {
scale = 1;
}
img.width = parseInt(img.width * scale, 10);
img.height = parseInt(img.height * scale, 10);
if (noCanvas || typeof canvas.getContext !== func) {
return img;
}
canvas.width = img.width;
canvas.height = img.height;
canvas.getContext('2d').drawImage(img, 0, 0, img.width, img.height);
return canvas;
};
img = document.createElement('img');
urlAPI = typeof URL !== undef ? URL : typeof webkitURL !== undef ? webkitURL : null;
if (urlAPI && typeof urlAPI.createObjectURL === func) {
img.onload = function () {
urlAPI.revokeObjectURL(this.src);
callBack(scaleImage(img));
};
img.src = urlAPI.createObjectURL(file);
} else if (typeof FileReader !== undef &&
typeof FileReader.prototype.readAsDataURL === func) {
img.onload = function () {
callBack(scaleImage(img));
};
fileReader = new FileReader();
fileReader.onload = function (e) {
img.src = e.target.result;
};
fileReader.readAsDataURL(file);
} else {
callBack(null);
}
};
this.addNode = function (parentNode, node, callBack) {
if (node) {
if (parentNode && parentNode.length && node && node.length) {
node.css('display', 'none').appendTo(parentNode).fadeIn(function () {
if (typeof callBack === func) {
try {
callBack();
} catch (e) {
// Fix endless exception loop:
$(this).stop();
node.stop();
throw e;
}
}
@ -85,15 +147,15 @@
};
this.removeNode = function (node, callBack) {
if (node) {
if (node && node.length) {
node.fadeOut(function () {
$(this).remove();
node.remove();
if (typeof callBack === func) {
try {
callBack();
} catch (e) {
// Fix endless exception loop:
$(this).stop();
node.stop();
throw e;
}
}
@ -102,75 +164,207 @@
callBack();
}
};
this.replaceNode = function (oldNode, newNode, callBack) {
if (!(newNode && newNode.length)) {
return uploadHandler.removeNode(oldNode, callBack);
}
if (oldNode && oldNode.length) {
oldNode.fadeOut(function () {
newNode.css('display', 'none');
oldNode.replaceWith(newNode);
newNode.fadeIn(function () {
if (typeof callBack === func) {
try {
callBack();
} catch (e) {
// Fix endless exception loop:
oldNode.stop();
newNode.stop();
throw e;
}
}
});
});
} else if (typeof callBack === func) {
callBack();
}
};
this.resetProgressBarAll = function () {
if (uploadHandler.progressbarAll) {
uploadHandler.progressbarAll.progressbar(
'value',
0
);
}
};
this.hideProgressBarAll = function (callBack) {
if (uploadHandler.progressbarAll && !$(getUploadTable(uploadHandler))
.find(uploadHandler.progressSelector + ':visible:first').length) {
uploadHandler.progressbarAll.fadeOut(callBack);
} else if (typeof callBack === func) {
callBack();
}
};
this.onAbort = function (event, files, index, xhr, handler) {
handler.removeNode(handler.uploadRow);
handler.removeNode(handler.uploadRow, handler.hideProgressBarAll);
};
this.cancelUpload = function (event, files, index, xhr, handler) {
var readyState = xhr.readyState;
xhr.abort();
// If readyState is below 2, abort() has no effect:
if (isNaN(readyState) || readyState < 2) {
if (typeof readyState !== 'number' || readyState < 2) {
handler.onAbort(event, files, index, xhr, handler);
}
};
this.initProgressBar = function (node, value) {
if (!node || !node.length) {
return null;
}
if (typeof node.progressbar === func) {
return node.progressbar({
value: value
});
} else {
var progressbar = $('<progress value="' + value + '" max="100"/>').appendTo(node);
progressbar.progressbar = function (key, value) {
progressbar.attr('value', value);
};
return progressbar;
node.addClass('progressbar')
.append($('<div/>').css('width', value + '%'))
.progressbar = function (key, value) {
return this.each(function () {
if (key === 'destroy') {
$(this).removeClass('progressbar').empty();
} else {
$(this).children().css('width', value + '%');
}
});
};
return node;
}
};
this.destroyProgressBar = function (node) {
if (!node || !node.length) {
return null;
}
return node.progressbar('destroy');
};
this.initUploadProgress = function (xhr, handler) {
if (!xhr.upload && handler.progressbar) {
handler.progressbar.progressbar(
'value',
100 // indeterminate progress displayed by a full animated progress bar
);
}
};
this.initUploadProgressAll = function () {
if (uploadHandler.progressbarAll && uploadHandler.progressbarAll.is(':hidden')) {
uploadHandler.progressbarAll.fadeIn();
}
};
this.onSend = function (event, files, index, xhr, handler) {
handler.initUploadProgress(xhr, handler);
};
this.onProgress = function (event, files, index, xhr, handler) {
if (handler.progressbar && event.lengthComputable) {
handler.progressbar.progressbar(
'value',
parseInt(event.loaded / event.total * 100, 10)
);
}
};
this.onProgressAll = function (event, list) {
if (uploadHandler.progressbarAll && event.lengthComputable) {
uploadHandler.progressbarAll.progressbar(
'value',
parseInt(event.loaded / event.total * 100, 10)
);
}
};
this.onLoadAll = function (list) {
multiLoader.complete();
};
this.initProgressBarAll = function () {
if (!uploadHandler.progressbarAll) {
uploadHandler.progressbarAll = uploadHandler.initProgressBar(
(typeof uploadHandler.progressAllNode === func ?
uploadHandler.progressAllNode(uploadHandler) : uploadHandler.progressAllNode),
0
);
}
};
this.initUploadRow = function (event, files, index, xhr, handler, callBack) {
var uploadRow = handler.uploadRow = handler.buildUploadRow(files, index, handler);
this.destroyProgressBarAll = function () {
uploadHandler.destroyProgressBar(uploadHandler.progressbarAll);
};
this.loadPreviewImage = function (files, index, handler) {
index = index || 0;
handler.uploadRow.find(handler.previewSelector).each(function () {
var previewNode = $(this),
file = files[index];
setTimeout(function () {
handler.loadImage(
file,
function (img) {
handler.addNode(
previewNode,
$(img)
);
},
handler.previewMaxWidth,
handler.previewMaxHeight,
handler.imageTypes,
!handler.previewAsCanvas
);
}, handler.previewLoadDelay);
index += 1;
});
};
this.initUploadRow = function (event, files, index, xhr, handler) {
var uploadRow = handler.uploadRow = (typeof handler.buildUploadRow === func ?
handler.buildUploadRow(files, index, handler) : null);
if (uploadRow) {
handler.progressbar = handler.initProgressBar(
uploadRow.find(handler.progressSelector),
(xhr.upload ? 0 : 100)
0
);
uploadRow.find(handler.cancelSelector).click(function (e) {
handler.cancelUpload(e, files, index, xhr, handler);
e.preventDefault();
});
uploadRow.find(handler.previewSelector).each(function () {
$(this).append(new LocalImage(files[index], handler.imageTypes));
});
handler.loadPreviewImage(files, index, handler);
}
handler.addNode(
(typeof handler.uploadTable === func ? handler.uploadTable(handler) : handler.uploadTable),
uploadRow,
callBack
);
};
this.initUpload = function (event, files, index, xhr, handler, callBack) {
handler.initUploadRow(event, files, index, xhr, handler, function () {
if (typeof handler.beforeSend === func) {
handler.beforeSend(event, files, index, xhr, handler, callBack);
} else {
callBack();
handler.initUploadRow(event, files, index, xhr, handler);
handler.addNode(
getUploadTable(handler),
handler.uploadRow,
function () {
if (typeof handler.beforeSend === func) {
handler.beforeSend(event, files, index, xhr, handler, callBack);
} else {
callBack();
}
}
});
};
this.onProgress = function (event, files, index, xhr, handler) {
if (handler.progressbar) {
handler.progressbar.progressbar(
'value',
parseInt(event.loaded / event.total * 100, 10)
);
}
);
handler.initUploadProgressAll();
};
this.parseResponse = function (xhr) {
this.parseResponse = function (xhr, handler) {
if (typeof xhr.responseText !== undef) {
return $.parseJSON(xhr.responseText);
} else {
@ -179,16 +373,10 @@
}
};
this.initDownloadRow = function (event, files, index, xhr, handler, callBack) {
this.initDownloadRow = function (event, files, index, xhr, handler) {
var json, downloadRow;
try {
json = handler.response = handler.parseResponse(xhr);
downloadRow = handler.downloadRow = handler.buildDownloadRow(json, handler);
handler.addNode(
(typeof handler.downloadTable === func ? handler.downloadTable(handler) : handler.downloadTable),
downloadRow,
callBack
);
json = handler.response = handler.parseResponse(xhr, handler);
} catch (e) {
if (typeof handler.onError === func) {
handler.originalEvent = event;
@ -197,16 +385,33 @@
throw e;
}
}
downloadRow = handler.downloadRow = (typeof handler.buildDownloadRow === func ?
handler.buildDownloadRow(json, handler) : null);
};
this.onLoad = function (event, files, index, xhr, handler) {
handler.removeNode(handler.uploadRow, function () {
handler.initDownloadRow(event, files, index, xhr, handler, function () {
var uploadTable = getUploadTable(handler),
downloadTable = getDownloadTable(handler),
callBack = function () {
if (typeof handler.onComplete === func) {
handler.onComplete(event, files, index, xhr, handler);
}
multiLoader.complete();
};
multiLoader.push(Array.prototype.slice.call(arguments, 1));
handler.initDownloadRow(event, files, index, xhr, handler);
if (uploadTable && handler.uploadRow && handler.uploadRow.length &&
(!downloadTable || uploadTable.get(0) === downloadTable.get(0))) {
handler.replaceNode(handler.uploadRow, handler.downloadRow, callBack);
} else {
handler.removeNode(handler.uploadRow, function () {
handler.addNode(
downloadTable,
handler.downloadRow,
callBack
);
});
});
}
};
this.dropZoneEnlarge = function () {
@ -269,6 +474,20 @@
}
};
this.init = function () {
uploadHandler.initProgressBarAll();
if (typeof uploadHandler.initExtended === func) {
uploadHandler.initExtended();
}
};
this.destroy = function () {
if (typeof uploadHandler.destroyExtended === func) {
uploadHandler.destroyExtended();
}
uploadHandler.destroyProgressBarAll();
};
$.extend(this, options);
};
@ -280,7 +499,7 @@
},
option: function (option, value, namespace) {
if (typeof option === undef || (typeof option === 'string' && typeof value === undef)) {
if (!option || (typeof option === 'string' && typeof value === undef)) {
return $(this).fileUpload('option', option, value, namespace);
}
return this.each(function () {
@ -292,6 +511,12 @@
return this.each(function () {
$(this).fileUpload('destroy', namespace);
});
},
upload: function (files, namespace) {
return this.each(function () {
$(this).fileUpload('upload', files, namespace);
});
}
};
@ -301,7 +526,7 @@
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.fileUploadUI');
$.error('Method "' + method + '" does not exist on jQuery.fileUploadUI');
}
};

@ -1,34 +1,66 @@
/*
* jQuery File Upload Plugin 3.7.1
* jQuery File Upload Plugin 4.5.1
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Copyright 2010, Sebastian Tschan, AQUANTUM
* Licensed under the MIT license:
* http://creativecommons.org/licenses/MIT/
*
* https://blueimp.net
* http://www.aquantum.de
*/
/*jslint browser: true */
/*global File, FileReader, FormData, unescape, jQuery */
/*jslint browser: true, unparam: true */
/*global XMLHttpRequestUpload, File, FileReader, FormData, ProgressEvent, unescape, jQuery, upload */
(function ($) {
'use strict';
var defaultNamespace = 'file_upload',
undef = 'undefined',
func = 'function',
num = 'number',
FileUpload,
methods,
MultiLoader = function (callBack, numberComplete) {
var loaded = 0;
MultiLoader = function (callBack, numOrList) {
var loaded = 0,
list = [];
if (numOrList) {
if (numOrList.length) {
list = numOrList;
} else {
list[numOrList - 1] = null;
}
}
this.complete = function () {
loaded += 1;
if (loaded === numberComplete) {
if (loaded === list.length) {
callBack(list);
loaded = 0;
list = [];
}
};
this.push = function (item) {
list.push(item);
};
this.getList = function () {
return list;
};
},
SequenceHandler = function () {
var sequence = [];
this.push = function (callBack) {
sequence.push(callBack);
if (sequence.length === 1) {
callBack();
}
};
this.next = function () {
sequence.shift();
if (sequence.length) {
sequence[0]();
}
};
};
FileUpload = function (container) {
@ -58,20 +90,36 @@
formData: function (form) {
return form.serializeArray();
},
requestHeaders: null,
multipart: true,
multiFileRequest: false,
withCredentials: false,
forceIframeUpload: false
forceIframeUpload: false,
sequentialUploads: false,
maxChunkSize: null,
maxFileReaderSize: 50000000,
replaceFileInput: true
},
documentListeners = {},
dropZoneListeners = {},
protocolRegExp = /^http(s)?:\/\//,
optionsReference,
multiLoader = new MultiLoader(function (list) {
if (typeof settings.onLoadAll === func) {
settings.onLoadAll(list);
}
}),
sequenceHandler = new SequenceHandler(),
completeNext = function () {
multiLoader.complete();
sequenceHandler.next();
},
isXHRUploadCapable = function () {
return typeof XMLHttpRequest !== undef && typeof File !== undef && (
!settings.multipart || typeof FormData !== undef || typeof FileReader !== undef
);
return typeof XMLHttpRequest !== undef && typeof XMLHttpRequestUpload !== undef &&
typeof File !== undef && (!settings.multipart || typeof FormData !== undef ||
(typeof FileReader !== undef && typeof XMLHttpRequest.prototype.sendAsBinary === func));
},
initEventHandlers = function () {
@ -116,27 +164,151 @@
fileInput.unbind('change.' + settings.namespace);
},
initUploadEventHandlers = function (files, index, xhr, settings) {
if (typeof settings.onProgress === func) {
xhr.upload.onprogress = function (e) {
settings.onProgress(e, files, index, xhr, settings);
isChunkedUpload = function (settings) {
return typeof settings.uploadedBytes !== undef;
},
createProgressEvent = function (lengthComputable, loaded, total) {
var event;
if (typeof document.createEvent === func && typeof ProgressEvent !== undef) {
event = document.createEvent('ProgressEvent');
event.initProgressEvent(
'progress',
false,
false,
lengthComputable,
loaded,
total
);
} else {
event = {
lengthComputable: true,
loaded: loaded,
total: total
};
}
return event;
},
getProgressTotal = function (files, index, settings) {
var i,
total;
if (typeof settings.progressTotal === undef) {
if (files[index]) {
total = files[index].size;
settings.progressTotal = total ? total : 1;
} else {
total = 0;
for (i = 0; i < files.length; i += 1) {
total += files[i].size;
}
settings.progressTotal = total;
}
}
return settings.progressTotal;
},
handleGlobalProgress = function (event, files, index, xhr, settings) {
var progressEvent,
loaderList,
globalLoaded = 0,
globalTotal = 0;
if (event.lengthComputable && typeof settings.onProgressAll === func) {
settings.progressLoaded = parseInt(
event.loaded / event.total * getProgressTotal(files, index, settings),
10
);
loaderList = multiLoader.getList();
$.each(loaderList, function (index, item) {
// item is an array with [files, index, xhr, settings]
globalLoaded += item[3].progressLoaded || 0;
globalTotal += getProgressTotal(item[0], item[1], item[3]);
});
progressEvent = createProgressEvent(
true,
globalLoaded,
globalTotal
);
settings.onProgressAll(progressEvent, loaderList);
}
},
handleLoadEvent = function (event, files, index, xhr, settings) {
var progressEvent;
if (isChunkedUpload(settings)) {
settings.uploadedBytes += settings.chunkSize;
progressEvent = createProgressEvent(
true,
settings.uploadedBytes,
files[index].size
);
if (typeof settings.onProgress === func) {
settings.onProgress(progressEvent, files, index, xhr, settings);
}
handleGlobalProgress(progressEvent, files, index, xhr, settings);
if (settings.uploadedBytes < files[index].size) {
if (typeof settings.resumeUpload === func) {
settings.resumeUpload(
event,
files,
index,
xhr,
settings,
function () {
upload(event, files, index, xhr, settings, true);
}
);
} else {
upload(event, files, index, xhr, settings, true);
}
return;
}
}
settings.progressLoaded = getProgressTotal(files, index, settings);
if (typeof settings.onLoad === func) {
xhr.onload = function (e) {
settings.onLoad(e, files, index, xhr, settings);
};
settings.onLoad(event, files, index, xhr, settings);
}
if (typeof settings.onAbort === func) {
xhr.onabort = function (e) {
settings.onAbort(e, files, index, xhr, settings);
};
completeNext();
},
handleProgressEvent = function (event, files, index, xhr, settings) {
var progressEvent = event;
if (isChunkedUpload(settings) && event.lengthComputable) {
progressEvent = createProgressEvent(
true,
settings.uploadedBytes + parseInt(event.loaded / event.total * settings.chunkSize, 10),
files[index].size
);
}
if (typeof settings.onError === func) {
xhr.onerror = function (e) {
settings.onError(e, files, index, xhr, settings);
if (typeof settings.onProgress === func) {
settings.onProgress(progressEvent, files, index, xhr, settings);
}
handleGlobalProgress(progressEvent, files, index, xhr, settings);
},
initUploadEventHandlers = function (files, index, xhr, settings) {
if (xhr.upload) {
xhr.upload.onprogress = function (e) {
handleProgressEvent(e, files, index, xhr, settings);
};
}
xhr.onload = function (e) {
handleLoadEvent(e, files, index, xhr, settings);
};
xhr.onabort = function (e) {
settings.progressTotal = settings.progressLoaded;
if (typeof settings.onAbort === func) {
settings.onAbort(e, files, index, xhr, settings);
}
completeNext();
};
xhr.onerror = function (e) {
settings.progressTotal = settings.progressLoaded;
if (typeof settings.onError === func) {
settings.onError(e, files, index, xhr, settings);
}
completeNext();
};
},
getUrl = function (settings) {
@ -191,12 +363,35 @@
return true;
},
nonMultipartUpload = function (file, xhr, sameDomain) {
initUploadRequest = function (files, index, xhr, settings) {
var file = files[index],
url = getUrl(settings),
sameDomain = isSameDomain(url);
xhr.open(getMethod(settings), url, true);
if (sameDomain) {
xhr.setRequestHeader('X-File-Name', unescape(encodeURIComponent(file.name)));
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
if (!settings.multipart || isChunkedUpload(settings)) {
xhr.setRequestHeader('X-File-Name', file.name);
xhr.setRequestHeader('X-File-Type', file.type);
xhr.setRequestHeader('X-File-Size', file.size);
if (!isChunkedUpload(settings)) {
xhr.setRequestHeader('Content-Type', file.type);
} else if (!settings.multipart) {
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
}
}
} else if (settings.withCredentials) {
xhr.withCredentials = true;
}
if ($.isArray(settings.requestHeaders)) {
$.each(settings.requestHeaders, function (index, header) {
xhr.setRequestHeader(header.name, header.value);
});
} else if (settings.requestHeaders) {
$.each(settings.requestHeaders, function (name, value) {
xhr.setRequestHeader(name, value);
});
}
xhr.setRequestHeader('Content-Type', file.type);
xhr.send(file);
},
formDataUpload = function (files, xhr, settings) {
@ -212,35 +407,41 @@
},
loadFileContent = function (file, callBack) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
file.content = e.target.result;
callBack();
};
fileReader.readAsBinaryString(file);
file.reader = new FileReader();
file.reader.onload = callBack;
file.reader.readAsBinaryString(file);
},
utf8encode = function (str) {
return unescape(encodeURIComponent(str));
},
buildMultiPartFormData = function (boundary, files, filesFieldName, fields) {
var doubleDash = '--',
crlf = '\r\n',
formData = '';
formData = '',
buffer = [];
$.each(fields, function (index, field) {
formData += doubleDash + boundary + crlf +
'Content-Disposition: form-data; name="' +
unescape(encodeURIComponent(field.name)) +
utf8encode(field.name) +
'"' + crlf + crlf +
unescape(encodeURIComponent(field.value)) + crlf;
utf8encode(field.value) + crlf;
});
$.each(files, function (index, file) {
formData += doubleDash + boundary + crlf +
'Content-Disposition: form-data; name="' +
unescape(encodeURIComponent(filesFieldName)) +
'"; filename="' + unescape(encodeURIComponent(file.name)) + '"' + crlf +
'Content-Type: ' + file.type + crlf + crlf +
file.content + crlf;
utf8encode(filesFieldName) +
'"; filename="' + utf8encode(file.name) + '"' + crlf +
'Content-Type: ' + utf8encode(file.type) + crlf + crlf;
buffer.push(formData);
buffer.push(file.reader.result);
delete file.reader;
formData = crlf;
});
formData += doubleDash + boundary + doubleDash + crlf;
return formData;
buffer.push(formData);
return buffer.join('');
},
fileReaderUpload = function (files, xhr, settings) {
@ -261,33 +462,58 @@
}
},
upload = function (files, index, xhr, settings) {
var url = getUrl(settings),
sameDomain = isSameDomain(url),
filesToUpload;
initUploadEventHandlers(files, index, xhr, settings);
xhr.open(getMethod(settings), url, true);
if (sameDomain) {
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
} else if (settings.withCredentials) {
xhr.withCredentials = true;
getBlob = function (file, settings) {
var blob,
ub = settings.uploadedBytes,
mcs = settings.maxChunkSize;
if (file && typeof file.slice === func && (ub || (mcs && mcs < file.size))) {
settings.uploadedBytes = ub = ub || 0;
blob = file.slice(ub, mcs || file.size - ub);
settings.chunkSize = blob.size;
return blob;
}
if (!settings.multipart) {
nonMultipartUpload(files[index], xhr, sameDomain);
} else {
if (typeof index === num) {
filesToUpload = [files[index]];
} else {
filesToUpload = files;
return file;
},
upload = function (event, files, index, xhr, settings, nextChunk) {
var send;
send = function () {
if (!nextChunk) {
if (typeof settings.onSend === func &&
settings.onSend(event, files, index, xhr, settings) === false) {
completeNext();
return;
}
}
if (typeof FormData !== undef) {
formDataUpload(filesToUpload, xhr, settings);
} else if (typeof FileReader !== undef) {
fileReaderUpload(filesToUpload, xhr, settings);
var blob = getBlob(files[index], settings),
filesToUpload;
initUploadEventHandlers(files, index, xhr, settings);
initUploadRequest(files, index, xhr, settings);
if (!settings.multipart) {
if (xhr.upload) {
xhr.send(blob);
} else {
$.error('Browser does not support XHR file uploads');
}
} else {
$.error('Browser does neither support FormData nor FileReader interface');
filesToUpload = (typeof index === 'number') ? [blob] : files;
if (typeof FormData !== undef) {
formDataUpload(filesToUpload, xhr, settings);
} else if (typeof FileReader !== undef && typeof xhr.sendAsBinary === func) {
fileReaderUpload(filesToUpload, xhr, settings);
} else {
$.error('Browser does not support multipart/form-data XHR file uploads');
}
}
};
if (!nextChunk) {
multiLoader.push(Array.prototype.slice.call(arguments, 1));
if (settings.sequentialUploads) {
sequenceHandler.push(send);
return;
}
}
send();
},
handleUpload = function (event, files, input, form, index) {
@ -303,23 +529,27 @@
xhr,
uploadSettings,
function () {
upload(files, index, xhr, uploadSettings);
upload(event, files, index, xhr, uploadSettings);
}
);
} else {
upload(files, index, xhr, uploadSettings);
upload(event, files, index, xhr, uploadSettings);
}
},
handleFiles = function (event, files, input, form) {
var i;
if (settings.multiFileRequest) {
handleUpload(event, files, input, form);
handleLegacyGlobalProgress = function (event, files, index, iframe, settings) {
var total = 0,
progressEvent;
if (typeof index === undef) {
$.each(files, function (index, file) {
total += file.size ? file.size : 1;
});
} else {
for (i = 0; i < files.length; i += 1) {
handleUpload(event, files, input, form, i);
}
total = files[index].size ? files[index].size : 1;
}
progressEvent = createProgressEvent(true, total, total);
settings.progressLoaded = total;
handleGlobalProgress(progressEvent, files, index, iframe, settings);
},
legacyUploadFormDataInit = function (input, form, settings) {
@ -347,49 +577,90 @@
form.find('.' + settings.namespace + '_form_data').remove();
},
legacyUpload = function (input, form, iframe, settings) {
var originalAction = form.attr('action'),
originalMethod = form.attr('method'),
originalTarget = form.attr('target');
iframe
.unbind('abort')
.bind('abort', function (e) {
iframe.readyState = 0;
// javascript:false as iframe src prevents warning popups on HTTPS in IE6
// concat is used here to prevent the "Script URL" JSLint error:
iframe.unbind('load').attr('src', 'javascript'.concat(':false;'));
if (typeof settings.onAbort === func) {
settings.onAbort(e, [{name: input.val(), type: null, size: null}], 0, iframe, settings);
}
})
.unbind('load')
.bind('load', function (e) {
iframe.readyState = 4;
if (typeof settings.onLoad === func) {
settings.onLoad(e, [{name: input.val(), type: null, size: null}], 0, iframe, settings);
legacyUpload = function (event, files, input, form, iframe, settings, index) {
var send;
send = function () {
if (typeof settings.onSend === func && settings.onSend(event, files, index, iframe, settings) === false) {
completeNext();
return;
}
var originalAttributes = {
'action': form.attr('action'),
'method': form.attr('method'),
'target': form.attr('target'),
'enctype': form.attr('enctype')
};
iframe
.unbind('abort')
.bind('abort', function (e) {
iframe.readyState = 0;
// javascript:false as iframe src prevents warning popups on HTTPS in IE6
// concat is used here to prevent the "Script URL" JSLint error:
iframe.unbind('load').attr('src', 'javascript'.concat(':false;'));
handleLegacyGlobalProgress(e, files, index, iframe, settings);
if (typeof settings.onAbort === func) {
settings.onAbort(e, files, index, iframe, settings);
}
completeNext();
})
.unbind('load')
.bind('load', function (e) {
iframe.readyState = 4;
handleLegacyGlobalProgress(e, files, index, iframe, settings);
if (typeof settings.onLoad === func) {
settings.onLoad(e, files, index, iframe, settings);
}
// Fix for IE endless progress bar activity bug
// (happens on form submits to iframe targets):
$('<iframe src="javascript:false;" style="display:none;"></iframe>')
.appendTo(form).remove();
completeNext();
});
form
.attr('action', getUrl(settings))
.attr('method', getMethod(settings))
.attr('target', iframe.attr('name'))
.attr('enctype', 'multipart/form-data');
legacyUploadFormDataInit(input, form, settings);
iframe.readyState = 2;
form.get(0).submit();
legacyUploadFormDataReset(input, form, settings);
$.each(originalAttributes, function (name, value) {
if (value) {
form.attr(name, value);
} else {
form.removeAttr(name);
}
// Fix for IE endless progress bar activity bug (happens on form submits to iframe targets):
$('<iframe src="javascript:false;" style="display:none"></iframe>').appendTo(form).remove();
});
form
.attr('action', getUrl(settings))
.attr('method', getMethod(settings))
.attr('target', iframe.attr('name'));
legacyUploadFormDataInit(input, form, settings);
iframe.readyState = 2;
form.get(0).submit();
legacyUploadFormDataReset(input, form, settings);
form
.attr('action', originalAction)
.attr('method', originalMethod)
.attr('target', originalTarget);
},
handleLegacyUpload = function (event, input, form) {
};
multiLoader.push([files, index, iframe, settings]);
if (settings.sequentialUploads) {
sequenceHandler.push(send);
} else {
send();
}
},
normalizeFile = function (index, file) {
if (typeof file.name === undef && typeof file.size === undef) {
file.name = file.fileName;
file.size = file.fileSize;
}
},
handleLegacyUpload = function (event, input, form, index) {
if (!(event && input && form)) {
$.error('Iframe based File Upload requires a file input change event');
return;
}
// javascript:false as iframe src prevents warning popups on HTTPS in IE6:
var iframe = $('<iframe src="javascript:false;" style="display:none" name="iframe_' +
var iframe = $('<iframe src="javascript:false;" style="display:none;" name="iframe_' +
settings.namespace + '_' + (new Date()).getTime() + '"></iframe>'),
uploadSettings = $.extend({}, settings);
uploadSettings = $.extend({}, settings),
files = event.target && event.target.files;
files = files ? Array.prototype.slice.call(files, 0) : [{name: input.val(), type: null, size: null}];
$.each(files, normalizeFile);
index = files.length === 1 ? 0 : index;
uploadSettings.fileInput = input;
uploadSettings.uploadForm = form;
iframe.readyState = 0;
@ -401,19 +672,55 @@
if (typeof uploadSettings.initUpload === func) {
uploadSettings.initUpload(
event,
[{name: input.val(), type: null, size: null}],
0,
files,
index,
iframe,
uploadSettings,
function () {
legacyUpload(input, form, iframe, uploadSettings);
legacyUpload(event, files, input, form, iframe, uploadSettings, index);
}
);
} else {
legacyUpload(input, form, iframe, uploadSettings);
legacyUpload(event, files, input, form, iframe, uploadSettings, index);
}
}).appendTo(form);
},
canHandleXHRUploadSize = function (files) {
var bytes = 0,
totalBytes = 0,
i;
if (settings.multipart && typeof FormData === undef) {
for (i = 0; i < files.length; i += 1) {
bytes = files[i].size;
if (bytes > settings.maxFileReaderSize) {
return false;
}
totalBytes += bytes;
}
if (settings.multiFileRequest && totalBytes > settings.maxFileReaderSize) {
return false;
}
}
return true;
},
handleFiles = function (event, files, input, form) {
if (!canHandleXHRUploadSize(files)) {
handleLegacyUpload(event, input, form);
return;
}
var i;
files = Array.prototype.slice.call(files, 0);
$.each(files, normalizeFile);
if (settings.multiFileRequest && settings.multipart && files.length) {
handleUpload(event, files, input, form);
} else {
for (i = 0; i < files.length; i += 1) {
handleUpload(event, files, input, form, i);
}
}
},
initUploadForm = function () {
uploadForm = (container.is('form') ? container : container.find('form'))
@ -421,7 +728,7 @@
},
initFileInput = function () {
fileInput = uploadForm.find('input:file')
fileInput = (uploadForm.length ? uploadForm : container).find('input:file')
.filter(settings.fileInputFilter);
},
@ -454,10 +761,10 @@
return false;
}
var dataTransfer = e.originalEvent.dataTransfer;
if (dataTransfer) {
if (dataTransfer && dataTransfer.files) {
dataTransfer.dropEffect = dataTransfer.effectAllowed = 'copy';
e.preventDefault();
}
e.preventDefault();
};
this.onDrop = function (e) {
@ -480,8 +787,10 @@
var input = $(e.target),
form = $(e.target.form);
if (form.length === 1) {
input.data(defaultNamespace + '_form', form);
replaceFileInput(input);
if (settings.replaceFileInput) {
input.data(defaultNamespace + '_form', form);
replaceFileInput(input);
}
} else {
form = input.data(defaultNamespace + '_form');
}
@ -508,6 +817,9 @@
.addClass(settings.cssClass);
settings.dropZone.not(container).addClass(settings.cssClass);
initEventHandlers();
if (typeof settings.init === func) {
settings.init();
}
};
this.options = function (options) {
@ -574,12 +886,22 @@
};
this.destroy = function () {
if (typeof settings.destroy === func) {
settings.destroy();
}
removeEventHandlers();
container
.removeData(settings.namespace)
.removeClass(settings.cssClass);
settings.dropZone.not(container).removeClass(settings.cssClass);
};
this.upload = function (files) {
if (typeof files.length === undef) {
files = [files];
}
handleFiles(null, files);
};
};
methods = {
@ -593,16 +915,29 @@
namespace = namespace ? namespace : defaultNamespace;
var fileUpload = $(this).data(namespace);
if (fileUpload) {
if (typeof option === 'string') {
return fileUpload.option(option, value);
if (!option) {
return fileUpload.options();
} else if (typeof option === 'string' && typeof value === undef) {
return fileUpload.option(option);
}
return fileUpload.options(option);
} else {
$.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
}
return this.each(function () {
var fu = $(this).data(namespace);
if (fu) {
if (typeof option === 'string') {
fu.option(option, value);
} else {
fu.options(option);
}
} else {
$.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
}
});
},
destroy : function (namespace) {
destroy: function (namespace) {
namespace = namespace ? namespace : defaultNamespace;
return this.each(function () {
var fileUpload = $(this).data(namespace);
@ -612,7 +947,18 @@
$.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
}
});
},
upload: function (files, namespace) {
namespace = namespace ? namespace : defaultNamespace;
return this.each(function () {
var fileUpload = $(this).data(namespace);
if (fileUpload) {
fileUpload.upload(files);
} else {
$.error('No FileUpload with namespace "' + namespace + '" assigned to this element');
}
});
}
};
@ -622,7 +968,7 @@
} else if (typeof method === 'object' || !method) {
return methods.init.apply(this, arguments);
} else {
$.error('Method ' + method + ' does not exist on jQuery.fileUpload');
$.error('Method "' + method + '" does not exist on jQuery.fileUpload');
}
};

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Loading…
Cancel
Save