File Uploads
Handle file uploads with progress tracking and validation
Learn how to implement robust file uploads with progress indicators and validation.
Basic Upload
import { storage } from '@demo/storage';
const handleUpload = async (file) => {
const result = await storage.upload(`uploads/${file.name}`, file);
console.log('Uploaded:', result.url);
};
Upload with Progress
Track upload progress for better UX:
const [progress, setProgress] = useState(0);
const uploadWithProgress = async (file) => {
await storage.upload(`uploads/${file.name}`, file, {
onProgress: (percent) => {
setProgress(percent);
}
});
};
File Validation
const validateFile = (file) => {
const maxSize = 10 * 1024 * 1024; // 10MB
const allowedTypes = ['image/jpeg', 'image/png', 'image/webp'];
if (file.size > maxSize) {
throw new Error('File too large (max 10MB)');
}
if (!allowedTypes.includes(file.type)) {
throw new Error('Invalid file type');
}
return true;
};Complete Example
function FileUploader() {
const [progress, setProgress] = useState(0);
const [error, setError] = useState(null);
const handleFile = async (e) => {
const file = e.target.files[0];
setError(null);
try {
validateFile(file);
await storage.upload(`uploads/${file.name}`, file, {
onProgress: setProgress
});
} catch (err) {
setError(err.message);
}
};
return (
<div>
<input type="file" onChange={handleFile} />
{progress > 0 && <ProgressBar value={progress} />}
{error && <Error message={error} />}
</div>
);
}