Skip to main content
The File Upload component provides an intuitive interface for uploading files with support for drag-and-drop, multiple files, validation, and upload progress.

Basic usage

<flx-file-upload
  (filesSelected)="onFilesSelected($event)">
</flx-file-upload>

Properties

accept
string
Accepted file types (e.g., ‘image/*’, ‘.pdf,.doc’)
multiple
boolean
default:"false"
Allow multiple file selection
maxSize
number
Maximum file size in bytes
maxFiles
number
Maximum number of files allowed
disabled
boolean
default:"false"
Disables the file upload
dragDrop
boolean
default:"true"
Enable drag-and-drop functionality
showFileList
boolean
default:"true"
Show list of selected files
showProgress
boolean
default:"true"
Show upload progress indicators
autoUpload
boolean
default:"false"
Start upload automatically when files are selected

Events

filesSelected
EventEmitter<File[]>
Emitted when files are selected
fileRemoved
EventEmitter<File>
Emitted when a file is removed from the list
uploadProgress
EventEmitter<UploadProgress>
Emitted during file upload with progress information
uploadComplete
EventEmitter<UploadResult>
Emitted when upload completes
uploadError
EventEmitter<Error>
Emitted when upload fails

Examples

<flx-file-upload
  (filesSelected)="handleFiles($event)">
</flx-file-upload>

<button
  *ngIf="selectedFiles.length > 0"
  (click)="upload()">
  Upload {{ selectedFiles.length }} file(s)
</button>
export class FileUploadExample {
  selectedFiles: File[] = [];

  handleFiles(files: File[]) {
    this.selectedFiles = files;
  }

  async upload() {
    for (const file of this.selectedFiles) {
      await this.uploadFile(file);
    }
  }

  async uploadFile(file: File) {
    const formData = new FormData();
    formData.append('file', file);
    await this.http.post('/api/upload', formData).toPromise();
  }
}

File validation

interface ValidationRules {
  accept?: string;          // MIME types or extensions
  maxSize?: number;         // Maximum file size in bytes
  maxFiles?: number;        // Maximum number of files
  minSize?: number;         // Minimum file size in bytes
  customValidator?: (file: File) => boolean;
}

Styling

flx-file-upload {
  --flx-upload-border-color: #d1d5db;
  --flx-upload-border-style: dashed;
  --flx-upload-border-width: 2px;
  --flx-upload-border-radius: 8px;
  --flx-upload-background: #f9fafb;
  --flx-upload-hover-background: #f3f4f6;
  --flx-upload-drag-background: #dbeafe;
  --flx-upload-drag-border-color: #3b82f6;
  --flx-upload-min-height: 200px;
  --flx-upload-progress-color: #3b82f6;
}

Accessibility

The File Upload component ensures accessibility:
  • Hidden file input with proper labels
  • Keyboard accessible (Enter/Space to trigger)
  • Screen reader announcements for file selection
  • Focus indicators
  • Drag-and-drop feedback

Best practices

  • Always validate file types and sizes on both client and server
  • Provide clear feedback about accepted file types and size limits
  • Show upload progress for better user experience
  • Handle errors gracefully with clear messages
  • Allow users to remove files before upload
  • Consider using thumbnails for image uploads
  • Implement chunked uploads for large files
  • Provide cancel functionality for ongoing uploads
For optimal user experience, set reasonable maxSize limits and show clear error messages when validation fails.
Always implement server-side validation as client-side checks can be bypassed. Never trust file extensions alone—verify file content.

Build docs developers (and LLMs) love