File Uploads

Learn how to handle file inputs and uploads in Aurelia forms.

Basic File Input

<form>
  <label for="fileUpload">Select files to upload:</label>
  <input
    id="fileUpload"
    type="file"
    multiple
    accept="image/*"
    change.trigger="handleFileSelect($event)" />

  <button
    click.trigger="uploadFiles()"
    disabled.bind="!selectedFiles.length">
    Upload
  </button>
</form>
export class FileUploadComponent {
  selectedFiles: File[] = [];

  handleFileSelect(event: Event) {
    const input = event.target as HTMLInputElement;
    if (!input.files?.length) return;

    this.selectedFiles = Array.from(input.files);
  }

  async uploadFiles() {
    if (this.selectedFiles.length === 0) return;

    const formData = new FormData();
    for (const file of this.selectedFiles) {
      formData.append('files', file, file.name);
    }

    try {
      const response = await fetch('/api/upload', {
        method: 'POST',
        body: formData
      });

      if (!response.ok) {
        throw new Error(`Upload failed with status ${response.status}`);
      }

      const result = await response.json();
      console.log('Upload successful:', result);
      this.selectedFiles = [];
    } catch (error) {
      console.error('Error uploading files:', error);
    }
  }
}

Single File Upload

File Preview

Validation

Progress Tracking

Best Practices

  1. Validate on both client and server - Always verify file types and sizes server-side

  2. Clean up object URLs - Revoke object URLs in detaching() to prevent memory leaks

  3. Show progress for large files - Use XMLHttpRequest for progress tracking

  4. Provide clear feedback - Show file names, sizes, and upload status

  5. Handle errors gracefully - Display meaningful error messages

Security Considerations

  • Validate file types server-side (don't trust accept attribute)

  • Check file sizes to prevent DoS attacks

  • Scan uploaded files for malware

  • Store files outside web root

  • Use unique filenames to prevent overwrites

  • Implement rate limiting

Last updated

Was this helpful?