-
-
Notifications
You must be signed in to change notification settings - Fork 7.9k
Basic plugin
The plugin download package comes with a complete user interface based on Bootstrap.
However, if you want to build your own user interface, it is possible to use only the basic plugin version and a minimal setup.
The following is an alternative to index.html with only the minimal requirements and a simple done callback handler (see API and Options on how to use the different options and callbacks):
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>jQuery File Upload Example</title>
</head>
<body>
<input id="fileupload" type="file" name="files[]" data-url="server/php/" multiple>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="js/vendor/jquery.ui.widget.js"></script>
<script src="js/jquery.iframe-transport.js"></script>
<script src="js/jquery.fileupload.js"></script>
<script>
$(function () {
$('#fileupload').fileupload({
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
$('<p></p>').text(file.name).appendTo(document.body);
});
}
});
});
</script>
</body>
</html>
The example above sets the dataType option to json, expecting the server to return a JSON response for each uploaded file. However it's also possible to handle HTML content types as response or any other dataType that you can handle in your done handler.
The fileupload plugin triggers progress events for both individual uploads (progress) and all running uploads combined (progressall). Event handlers can be set via the event binding mechanism or as widget options (see API and Options documentation):
$('#fileupload').fileupload({
/* ... */
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .bar').css(
'width',
progress + '%'
);
}
});
The previous code assumes a progress node with an inner element that displays the progress status via its width percentage:
<div id="progress">
<div class="bar" style="width: 0%;"></div>
</div>
The inner element should have a different background color than the container node, set via CSS and needs a height applied:
.bar {
height: 18px;
background: green;
}
Included scripts:
- https://blueimp.github.io/jQuery-File-Upload/js/vendor/jquery.ui.widget.js
- https://blueimp.github.io/jQuery-File-Upload/js/jquery.fileupload.js
HTML:
<input
id="fileupload"
type="file"
name="files[]"
data-url="//jquery-file-upload.appspot.com/"
multiple>
CSS:
.file {
position: relative;
background: linear-gradient(to right, lightblue 50%, transparent 50%);
background-size: 200% 100%;
background-position: right bottom;
transition:all 1s ease;
}
.file.done {
background: lightgreen;
}
.file a {
display: block;
position: relative;
padding: 5px;
color: black;
}
JS:
$("#fileupload").fileupload({
dataType: "json",
add: function(e, data) {
data.context = $('<p class="file"></p>')
.append($('<a target="_blank"></a>').text(data.files[0].name))
.appendTo(document.body);
data.submit();
},
progress: function(e, data) {
var progress = parseInt((data.loaded / data.total) * 100, 10);
data.context.css("background-position-x", 100 - progress + "%");
},
done: function(e, data) {
data.context
.addClass("done")
.find("a")
.prop("href", data.result.files[0].url);
}
});
Often, you will display a file to upload in an element node. This can be done in the add callback.
To be able to refer to the same element node in other callbacks related to the upload, you can make use of the context option (which is actually an option of jquery.ajax):
$(function () {
$('#fileupload').fileupload({
dataType: 'json',
add: function (e, data) {
data.context = $('<p></p>').text('Uploading...').appendTo(document.body);
data.submit();
},
done: function (e, data) {
data.context.text('Upload finished.');
}
});
});
Based on the previous example, it's possible to start uploads on the click of a button instead of automatically:
$(function () {
$('#fileupload').fileupload({
dataType: 'json',
add: function (e, data) {
data.context = $('<button></button>').text('Upload')
.appendTo(document.body)
.click(function () {
data.context = $('<p></p>').text('Uploading...').replaceAll($(this));
data.submit();
});
},
done: function (e, data) {
data.context.text('Upload finished.');
}
});
});
Please see Client side Image Resizing.