MazDropzone
MazDropzone is a powerful and flexible file upload component with drag & drop support, progress tracking, and customizable UI. Perfect for handling single or multiple file uploads in your Vue applications.
Before use it, you should install the MazUi plugin in your project, follow instructions in Getting Started
TIP
This component can be translated globally using the MazUi plugin.
Key Features
- 🎯 Drag & drop support
- 📁 Single or multiple file uploads
- 🖼️ Image preview thumbnails
- 🚀 Auto upload support
- ⚡ Async file processing
- 🎨 Fully customizable UI
- 🌐 Support for various file types
- ⚙️ Extensive configuration options
- 🔒 File validation (size, type, count)
- 🌍 Internationalization support
Error codes
| Error Code | Description | Trigger |
|---|---|---|
FILE_SIZE_EXCEEDED | File size exceeds the allowed limit | When a file is larger than maxFileSize (in MB) |
FILE_SIZE_TOO_SMALL | File size is below the minimum limit | When a file is smaller than minFileSize (in MB) |
MAX_FILES_EXCEEDED | Maximum number of allowed files exceeded | When trying to add more files than maxFiles or more than 1 file if multiple=false |
FILE_TYPE_NOT_ALLOWED | File type is not allowed | When the file's MIME type doesn't match the specified dataTypes |
FILE_DUPLICATED | An identical file already exists | When allowDuplicates=false and a file with the same name, size and type already exists |
NO_FILES_TO_UPLOAD | No files to upload | When starting upload but there are no files in the dropzone |
FILE_UPLOAD_ERROR | Error during individual file upload | When uploading a specific file fails (single mode) |
FILE_UPLOAD_ERROR_MULTIPLE | Error during batch upload | When uploading multiple files fails (multiple mode) |
NO_URL | No upload URL configured | When attempting auto-upload without defining the url prop |
Error handling example
View code
<script setup>
function handleError({ code, files }) {
switch (code) {
case 'FILE_SIZE_EXCEEDED':
console.log('File too large:', files[0].name)
break
case 'FILE_TYPE_NOT_ALLOWED':
console.log('File type not allowed:', files[0].type)
break
case 'MAX_FILES_EXCEEDED':
console.log('Too many files selected')
break
// ...
}
}
</script>
<template>
<MazDropzone
:max-file-size="5"
:max-files="3"
:data-types="['image/*', 'application/pdf']"
:allow-duplicates="false"
@error="handleError"
/>
</template>Basic Usage
File Type Restrictions
You can restrict allowed file types using the data-types prop:
Auto Upload
Enable automatic file upload using the auto-upload prop. Files can be uploaded individually (single) in separate requests or all at once (multiple) in a single request:
You can also upload all files at once using multiple:
TIP
Multiple upload is allowed:
- when
max-filesis greater than 1 - when
auto-uploadis set tomultiple - when
multipleprop is set totrue
Custom Upload Area
Customize the upload area using slots:
Custom Translations
Using translations prop
Customize text messages using the translations prop:
Using MazUi plugin
You can also use the MazUi plugin to customize the translations:
View code
import { MazUi } from 'maz-ui/plugins/maz-ui'
app.use(MazUi, {
translations: {
locale: 'en',
messages: {
en: {
dropzone: {
dragAndDrop: 'Drag files here',
selectFile: 'select files',
divider: 'or',
fileMaxCount: 'Maximum {count} files',
fileMaxSize: 'Maximum {size} MB',
fileTypes: 'Allowed file types: {types}',
},
},
},
},
})Custom Upload Request
Customize the upload request using uploadUrl, requestOptions and transformBody:
Props
| Name | Description | Type | Required | Default |
|---|---|---|---|---|
| id | The id of the dropzone | string | No | undefined |
| multiple | Allow multiple files to be uploaded. | boolean | No | false |
| data-types | Allowed data types/MIME types for files (e.g. ['application/json']) | string[] | No | ['*\/*'] |
| prevent-default-for-unhandled | Prevent default behavior for unhandled drag & drop events. | boolean | No | true |
| max-file-size | Maximum file size in MB. | number | No | undefined |
| max-files | Maximum number of files allowed. | number | No | undefined |
| disabled | Disable the dropzone | boolean | No | undefined |
| preview | Show file preview | boolean | No | undefined |
| min-file-size | Minimum file size in MB | number | No | undefined |
| allow-duplicates | Allow duplicates | boolean | No | false |
| translations | Translations Custom translations for the component | Partial<MazUiTranslationsNestedSchema['dropzone']> | No | undefined |
| color | Main color of the component | MazColor | No | primary |
| remove-file-btn-props | MazBtn props MazBtn props | MazBtnProps | No | {} |
| spinner-props | MazSpinner props MazSpinner props | MazSpinnerProps | No | {} |
| auto-upload | Auto upload files If set to multiple, all files will be uploaded at once in a single request. If set to single, files will be uploaded one by one in separate requests. If set to false, no upload will be done automatically. | "multiple" | "single" | false | No | false |
| url | Upload URL If set, files will be uploaded to the given URL. | string | No | undefined |
| request-options | Request options Request options to be used for the upload (using fetch) Request options Example: { mode: 'no-cors', headers: { 'Content-Type': 'multipart/form-data', 'Authorization': 'Bearer 1234567890' } } | RequestInit | No | undefined |
| transform-body | Transform the body of the request | TSFunctionType | No | undefined |
| max-concurrent-uploads | Maximum number of concurrent uploads Limit the number of files uploaded simultaneously to avoid overwhelming the server | number | No | 5 |
Events
| Event name | Properties | Description |
|---|---|---|
| drop | values { files: File[] | null, event: DragEvent } - The dropped files and the drag event | Event emitted when files are dropped in the dropzone |
| enter | values { files: File[] | null, event: DragEvent } - The dragged files and the drag event | Event emitted when dragged files enter the dropzone |
| leave | values { files: File[] | null, event: DragEvent } - The dragged files and the drag event | Event emitted when dragged files leave the dropzone |
| over | values { files: File[] | null, event: DragEvent } - The dragged files and the drag event | Event emitted when dragged files are over the dropzone |
| add | value File - The added file | Event emitted when a file is added to the dropzone |
| remove | value File - The removed file | Event emitted when a file is removed from the dropzone |
| error | values { files: File[] | null, event: DragEvent | null, code: MazDropzoneErrorCode } - The files, event and error code | Event emitted when an error occurs |
| upload-error | values { file: File, code: MazDropzoneErrorCode, error: unknown } - The file, error code and error details | Event emitted when an error occurs during file upload |
| upload-error-multiple | values { files: File[], code: MazDropzoneErrorCode, error: unknown } - The files, error code and error details | Event emitted when an error occurs during multiple files upload |
| upload-success | values { file: File, response?: Response } - The uploaded file and the response | Event emitted when a file is successfully uploaded |
| upload-success-multiple | values { files: File[], response?: Response } - The uploaded files and the response | Event emitted when multiple files are successfully uploaded |
Slots
| Name | Description | Bindings |
|---|---|---|
| files-area | Slot to customize the files area | files-data MazDropzoneFileData[] - The files data |
| file-item | Slot to customize the file item | file MazDropzoneFileData - The drop file data |
| no-files-area | Slot to customize the no files area | select-file Function - The function to select the file |
| upload-icon | Slot to customize the upload icon |
Expose
uploadFiles
Upload files
@descriptionWith this method, the files are uploaded one by one (a request for each file)@usagemazDropzoneInstance.value?.uploadFiles()
uploadFilesMultiple
Upload multiple files
@descriptionWith this method, the files are uploaded all at once in a single request@usagemazDropzoneInstance.value?.uploadFilesMultiple()
getFormData
Get form data
@descriptionGet the form data of one file@usageconst formData = mazDropzoneInstance.value?.getFormData(file)
getFormDataMultiple
Get form data multiple
@descriptionGet the form data of all files@usageconst formData = mazDropzoneInstance.value?.getFormDataMultiple()
reset
Reset the files
@descriptionRemove all files from the dropzone@usagemazDropzoneInstance.value?.reset()
isUploading
Check if the files are uploading
@descriptionCheck if the files are uploading@usageconst isUploading = mazDropzoneInstance.value?.isUploading
addFile
Add a file to the dropzone
@descriptionAdd a file manually to the dropzone@usagemazDropzoneInstance.value?.addFile(file)
removeFile
Remove a file from the dropzone
@descriptionRemove a file manually from the dropzone@usagemazDropzoneInstance.value?.removeFile(file)