- Overview
- Documents
DropzoneJS is an open source library that provides drag and drop file uploads with image previews and shows nice progress bars.
Main features
- Image thumbnail previews. Simply register the callback thumbnail(file, data) and display the image wherever you like
- Retina enabled
- Multiple files and synchronous uploads
- Progress updates
- Support for large files
- Complete theming. The look and feel of Dropzone is just the default theme. You can define everything yourself by overwriting the default event listeners.
- Well tested
Browser support
- Chrome 7+
- Firefox 4+
- IE 10+
- Opera 12+ (Version 12 for MacOS is disabled because their API is buggy)
- Safari 6+
Source: dropzonejs.com
1. INSTALLATION
<script src="./path/to/dropzone.js"></script>
2. USAGE
The typical way of using dropzone is by creating a form element with the class dropzone:
<form action="/file-upload" class="dropzone" id="my-awesome-dropzone"></form>
That's it. Dropzone will find all form elements with the class dropzone, automatically attach itself to it, and upload files dropped into it to the specified action attribute. The uploaded files can be handled just as if there would have been a html input like this:
<input type="file" name="file" />
If you want your file uploads to work even without JavaScript, you can include an element with the classfallback that dropzone will remove if the browser is supported. If the browser isn't supported, Dropzone will not create fallback elements if there is a fallback element already provided. (Obviously, if the browser doesn't support JavaScript, the form will stay as is)
Typically this will look like this:
<form action="/file-upload" class="dropzone"> <div class="fallback"> <input name="file" type="file" multiple /> </div> </form>
Create dropzones programmatically
Alternatively you can create dropzones programmaticaly (even on non form elements) by instantiating theDropzone class
// Dropzone class: var myDropzone = new Dropzone("div#myId", { url: "/file/post"});
or if you use jQuery, you can use the jQuery plugin Dropzone ships with:
// jQuery $("div#myId").dropzone({ url: "/file/post" });
3. OPTIONS
There are two ways to configure dropzones.
The obvious way is to pass an options object when instantiating a dropzone programmatically like in the previous create dropzones programmatically section.
But if you just have HTML elements with the dropzone class, then you don't programmatically instantiate the objects, so you have to store the configuration somewhere so Dropzone knows how to configure the dropzones when instantiating them.
This is done with the Dropzone.options object.
// "myAwesomeDropzone" is the camelized version of the HTML element's ID Dropzone.options.myAwesomeDropzone = { paramName: "file", // The name that will be used to transfer the file maxFilesize: 2, // MB accept: function(file, done) { if (file.name == "justinbieber.jpg") { done("Naha, you don't."); } else { done(); } } };
If you want to disable the auto discover behaviour of Dropzone, you can either disable it on a per element basis, or in general:
// Prevent Dropzone from auto discovering this element: Dropzone.options.myAwesomeDropzone = false; // This is useful when you want to create the // Dropzone programmatically later // Disable auto discover for all elements: Dropzone.autoDiscover = false;
The valid options are:
Option | Description |
---|---|
url | Has to be specified on elements other than form (or when the form doesn't have an action attribute) |
method | Defaults to "post" and can be changed to "put" if necessary. |
parallelUploads | How many file uploads to process in parallel (See the Enqueuing file uploads section for more info) |
maxFilesize | in MB |
paramName | The name of the file param that gets transferred. Defaults tofile. NOTE: If you have the option uploadMultiple set totrue, then Dropzone will append [] to the name. |
uploadMultiple | Whether Dropzone should send multiple files in one request. If this it set to true, then the fallback file input element will have themultiple attribute as well. This option will also trigger additional events (like processingmultiple). See the events section for more information. |
headers | An object to send additional headers to the server. Eg:headers: { "My-Awesome-Header": "header value" } |
addRemoveLinks | This will add a link to every file preview to remove or cancel (if already uploading) the file. The dictCancelUpload,dictCancelUploadConfirmation anddictRemoveFile options are used for the wording. |
previewsContainer | defines where to display the file previews – if null the Dropzone element is used. Can be a plain HTMLElement or a CSS selector. The element should have the dropzone-previews class so the previews are displayed properly. |
clickable | If true, the dropzone element itself will be clickable, if falsenothing will be clickable. Otherwise you can pass an HTML element, a CSS selector (for multiple elements) or an array of those. |
createImageThumbnails | |
maxThumbnailFilesize | in MB. When the filename exceeds this limit, the thumbnail will not be generated |
thumbnailWidth | if null, the ratio of the image will be used to calculate it. |
thumbnailHeight | the same as thumbnailWidth. If both are null, images will not be resized. |
maxFiles | if not null defines how many files this Dropzone handles. If it exceeds, the event maxfilesexceeded will be called. The dropzone element gets the class dz-max-files-reachedaccordingly so you can provided visual feedback. |
resize | is the function that gets called to create the resize information. It gets the file as first parameter and must return an object withsrcX, srcY, srcWidth and srcHeight and the same fortrg*. Those values are going to be used byctx.drawImage(). |
init | is a function that gets called when Dropzone is initialized. You can setup event listeners inside this function. |
acceptedMimeTypes | Deprecated in favor of acceptedFiles |
acceptedFiles | The default implementation of accept checks the file's mime type or extension against this list. This is a comma separated list of mime types or file extensions. Eg.:image/*,application/pdf,.psd. If the Dropzone isclickable this option will be used as accept parameter on the hidden file input as well. |
accept | is a function that gets a file and a done function as parameter. If the done function is invoked without a parameter, the file will be processed. If you pass an error message it will be displayed and the file will not be uploaded. This function will not be called if the file is too big or doesn't match the mime types. |
enqueueForUpload | Deprecated in favor of autoProcessQueue. |
autoProcessQueue | When set to false you have to callmyDropzone.processQueue() yourself in order to upload the dropped files. See below for more information on handling queues. |
previewTemplate | is a string that contains the template used for each dropped image. Change it to fulfill your needs but make sure to properly provide all elements. |
forceFallback | defaults to false. If true the fallback will be forced. This is very useful to test your server implementations first and make sure that everything works as expected without dropzone if you experience problems, and to test how your fallbacks will look. |
fallback | is a function that gets called when the browser is not supported. The default implementation shows the fallback input field and adds a text. |
to translate dropzone, you can also provide these options:
Option | Description |
---|---|
dictDefaultMessage | The message that gets displayed before any files are dropped. This is normally replaced by an image but defaults to "Drop files here to upload" |
dictFallbackMessage | If the browser is not supported, the default message will be replaced with this text. Defaults to "Your browser does not support drag'n'drop file uploads." |
dictFallbackText | This will be added before the file input files. If you provide a fallback element yourself, or if this option isnull this will be ignored. Defaults to "Please use the fallback form below to upload your files like in the olden days." |
dictInvalidFileType | Shown as error message if the file doesn't match the file type. |
dictFileTooBig | Shown when the file is too big. and will be replaced. |
dictResponseError | Shown as error message if the server response was invalid. `` will be replaced with the servers status code. |
dictCancelUpload | If addRemoveLinks is true, the text to be used for the cancel upload link. |
dictCancelUploadConfirmation | If addRemoveLinks is true, the text to be used for confirmation when cancelling upload. |
dictRemoveFile | If addRemoveLinks is true, the text to be used to remove a file. |
dictMaxFilesExceeded | If maxFiles is set, this will be the error message when it's exceeded. |
4. EVENTS
Dropzone triggers events when processing files, to which you can register easily.
Example:
// The recommended way from within the init configuration: Dropzone.options.myAwesomeDropzone = { init: function() { this.on("addedfile", function(file) { alert("Added file."); }); } }; // Or programmatically, when creating a Dropzone. // This is more complex and should only be used if you need to create your // Dropzones on demand. // // This example uses jQuery so it creates the Dropzone, only when the DOM has // loaded. // Disabling autoDiscover, otherwise Dropzone will try to attach twice. Dropzone.autoDiscover = false; // or disable for specific dropzone: // Dropzone.options.myDropzone = false; $(function() { // Now that the DOM is fully loaded, create the dropzone, and setup the // event listeners var myDropzone = new Dropzone("#my-dropzone"); myDropzone.on("addedfile", function(file) { /* Maybe display some more file information on your page */ }); })
Available events:
All of these receive the event as first parameter:
Parameter | Description |
---|---|
drop | The user dropped something onto the dropzone |
dragstart | |
dragend | |
dragenter | |
dragover | |
dragleave |
All of these receive the file as the first parameter:
Parameter | Description |
---|---|
addedfile | |
removedfile | Called whenever a file is removed from the list. You can listen to this and delete the file from your server if you want to. |
thumbnail | When the thumbnail has been generated. Receives the dataUrl as second parameter. |
error | An error occured. Receives the errorMessage as second parameter and if the error was due to the XMLHttpRequest the xhr object as third. |
processing | When a file gets processed (since there is a queue not all files are processed immediately). This event was called processingfilepreviously. |
uploadprogress |
Gets called periodically whenever the file upload progress changes. Gets the progress parameter as second parameter which is a percentage (0-100) and the bytesSent parameter as third which is the number of the bytes that have been sent to the server. When an upload finishes dropzone ensures that uploadprogress will be called with a percentage of 100 at least once. Warning: This function can potentially be called with the same progress multiple times. |
sending | Called just before each file is sent. Gets the xhr object and the formData objects as second and third parameters, so you can modify them (for example to add a CSRF token) or add additional data. |
success | The file has been uploaded successfully. Gets the server response as second argument. (This event was called finished previously) |
complete | Called when the upload was either successful or erroneous. |
canceled | Called when a file upload gets canceled. |
maxfilesreached | Called when the number of files accepted reached the maxFiles limit. |
maxfilesexceeded | Called for each file that has been rejected because the number of files exceeds the maxFiles limit. |
All of these receive a list of files as first parameter and are only called if the uploadMultiple option is true:
Parameter | Description |
---|---|
processingmultiple | See processing for description. |
sendingmultiple | See sending for description. |
successmultiple | See success for description. |
completemultiple | See complete for description. |
canceledmultiple | See canceled for description. |
Special events:
Parameter | Description |
---|---|
totaluploadprogress | Called with the total upload progress (0-100), the totalBytes and the totalBytesSent. This event can be used to show the overall upload progress of all files. |
reset | Called when all files in the list are removed and the dropzone is reset to initial state. |
queuecomplete | Called when all files in the queue finished uploading. |
5. METHODS
If you want to remove an added file from the dropzone, you can call .removeFile(file). This method also triggers the removedfile event.
Here's an example that would automatically remove a file when it's finished uploading:
myDropzone.on("complete", function(file) { myDropzone.removeFile(file); });
If you want to remove all files, simply use .removeAllFiles(). Files that are in the process of being uploaded won't be removed. If you want files that are currently uploading to be canceled, call.removeAllFiles(true) which will cancel the uploads.
If you have autoProcessQueue disabled, you'll need to call .processQueue() yourself.
This can be useful if you want to display the files and let the user click an accept button to actually upload the file(s).
To access all files in the dropzone, use myDropzone.files.
To get
- all accepted files: .getAcceptedFiles()
- all rejected files: .getRejectedFiles()
- all queued files: .getQueuedFiles()
- all uploading files: .getUploadingFiles()
If you do not need a dropzone anymore, just call .disable() on the object. This will remove all event listeners on the element, and clear all file arrays. To reenable a Dropzone use .enable().
If you don't like the default browser modals for confirm calls, you can handle them yourself by overwriting Dropzone.confirm.
Dropzone.confirm = function(question, accepted, rejected) { // Ask the question, and call accepted() or rejected() accordingly. // CAREFUL: rejected might not be defined. Do nothing in that case. };
6. LAYOUT
The HTML that is generated for each file by dropzone is defined with the option previewTemplatewhich defaults to this:
<div class="dz-preview dz-file-preview"> <div class="dz-details"> <div class="dz-filename"><span data-dz-name></span></div> <div class="dz-size" data-dz-size></div> <img data-dz-thumbnail /> </div> <div class="dz-progress"><span class="dz-upload" data-dz-uploadprogress></span></div> <div class="dz-success-mark"><span>✔</span></div> <div class="dz-error-mark"><span>✘</span></div> <div class="dz-error-message"><span data-dz-errormessage></span></div> </div>
The container (dz-preview) gets the dz-processing class when the file gets processed, dz-success when the file got uploaded and dz-error in case the file couldn't be uploaded. In the latter case, [data-dz-errormessage] will contain the text returned by the server.
You can access the HTML of the file preview in any of the events with file.previewElement.
If you decide to rewrite the previewTemplate from scratch, you should put elements with the data-dz-* attributes inside:
- data-dz-name
- data-dz-size
- data-dz-thumbnail (This has to be an <img /> element and the alt and src attributes will be changed by Dropzone)
- data-dz-uploadprogress (Dropzone will change the style.width property from 0% to100% whenever there's a uploadprogress event)
- data-dz-errormessage
The default options for Dropzone will look for those element and update the content for it.
If you want some specific link to remove a file (instead of the built in addRemoveLinks option), you can simply insert elements in the template with the data-dz-remove attribute. Example:
<img src="removebutton.png" alt="Click me to remove the file." data-dz-remove />
You are not forced to use those conventions though. If you override all the default event listeners you can completely rebuild your layout from scratch.
See the installation section on how to add the stylesheet and spritemaps if you want your dropzone to look like the one on this page.