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
Validate on both client and server - Always verify file types and sizes server-side
Clean up object URLs - Revoke object URLs in
detaching()to prevent memory leaksShow progress for large files - Use XMLHttpRequest for progress tracking
Provide clear feedback - Show file names, sizes, and upload status
Handle errors gracefully - Display meaningful error messages
Security Considerations
Validate file types server-side (don't trust
acceptattribute)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
Related
Last updated
Was this helpful?