A comprehensive Vue 3 file uploader component library with video thumbnail generation and multiple upload styles
npm install handy-uploader



A comprehensive Vue 3 file uploader component library with advanced features including automatic video thumbnail generation, multiple upload styles, and extensive file type support.
``bash`
npm install handy-uploader
`bash`
yarn add handy-uploader
`bash`
pnpm add handy-uploader
Make sure you have the required peer dependencies:
`bash`
npm install vue@^3.0.0 vuetify@^3.0.0
`vue
:max-file-count="5"
:accepted-file-types="['image/', 'video/']"
:language="'en'"
@files-selected="handleFilesSelected"
/>
`
`typescript
// main.ts
import { createApp } from 'vue'
import { createVuetify } from 'vuetify'
import 'vuetify/styles'
import '@mdi/font/css/materialdesignicons.css'
const vuetify = createVuetify()
const app = createApp(App)
app.use(vuetify)
app.mount('#app')
`
Perfect for media files with automatic video thumbnail generation:
`vue
:max-file-count="10"
:accepted-file-types="['image/', 'video/', 'application/pdf']"
:language="'en'"
:theme="'light'"
@files-selected="onFilesSelected"
@file-removed="onFileRemoved"
@error="onError"
/>
`
Great for document management with detailed file information:
`vue`
:max-file-count="20"
:language="'en'"
@files-selected="handleFiles"
/>
Minimal drag-and-drop interface:
`vue`
:accepted-file-types="['image/*']"
@files-selected="handleImages"
/>
| Prop | Type | Default | Description |
|------|------|---------|-------------|
| maxFileSize | number | 10485760 | Maximum file size in bytes (10MB) |maxFileCount
| | number | 5 | Maximum number of files |acceptedFileTypes
| | string[] | ['*'] | Accepted MIME types |language
| | string | 'en' | Language code |theme
| | string | 'light' | Theme variant |
| Event | Payload | Description |
|-------|---------|-------------|
| files-selected | FileData[] | Emitted when files are selected |file-removed
| | FileData | Emitted when a file is removed |error
| | Error | Emitted on errors |
`typescript`
interface FileData {
id: string
name: string
size: number
type: string
format: string
base64?: string
thumbnail?: string // Auto-generated for videos
lastModified: number
}
The library automatically generates thumbnails for video files:
`javascript`
// Thumbnails are generated automatically
const videoFile = {
name: 'video.mp4',
type: 'video',
thumbnail: 'data:image/jpeg;base64,/9j/4AAQ...' // Auto-generated
}
Automatic file type detection and icon assignment:
`javascript`
// Automatic type detection
const file = {
name: 'document.pdf',
type: 'document', // Auto-detected
icon: 'mdi-file-pdf-box', // Auto-assigned
color: 'red' // Auto-assigned
}
Built-in image compression for large files:
`vue`
:compression-quality="0.8"
:max-width="1920"
:max-height="1080"
/>
Supported languages:
`javascript`
const languages = [
'en', // English
'zh', // Chinese
'es', // Spanish
'fr', // French
'de', // German
'ja', // Japanese
'ko', // Korean
'ar' // Arabic (RTL)
]
Works with Vuetify's theming system:
`javascript`
// vuetify.config.js
export default createVuetify({
theme: {
themes: {
light: {
primary: '#1976D2',
secondary: '#424242',
// Custom theme colors
}
}
}
})
`vue`
`vue
File Upload with Video Thumbnails
:max-file-count="10"
:accepted-file-types="['image/', 'video/', 'application/pdf']"
:language="currentLanguage"
:theme="isDark ? 'dark' : 'light'"
:compress-images="true"
:compression-quality="0.8"
@files-selected="handleFilesSelected"
@file-removed="handleFileRemoved"
@error="handleError"
/>
Selected Files:
{{ file.name }} ({{ formatFileSize(file.size) }})
`
We welcome contributions! Please see our Contributing Guide for details.
1. Fork the repository
2. Create your feature branch (git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature'
3. Commit your changes ()git push origin feature/amazing-feature`)
4. Push to the branch (
5. Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- GitHub Repository
- npm Package
- Documentation
- Issues
!npm downloads
!GitHub stars
!GitHub issues
---
Made with ❤️ for the Vue.js community