# File Handling System Documentation ## Overview The VFX Project Management System includes a comprehensive file handling system that provides secure file upload, storage, serving, and access control for task attachments and work submissions. ## Features ### File Upload System - **Secure file validation** with format and size restrictions - **Organized directory structure** for efficient file storage - **Unique filename generation** to prevent conflicts - **Automatic thumbnail generation** for image files - **Version control** for submissions ### File Serving and Access Control - **Authenticated file serving** with role-based permissions - **Thumbnail serving** for quick previews - **Video streaming** for media playback - **File information API** for metadata access ## Supported File Formats ### Video Formats - `.mov` - QuickTime Movie - `.mp4` - MPEG-4 Video - `.avi` - Audio Video Interleave - `.mkv` - Matroska Video - `.webm` - WebM Video ### Image Formats - `.exr` - OpenEXR (High Dynamic Range) - `.jpg`, `.jpeg` - JPEG Image - `.png` - Portable Network Graphics - `.tiff`, `.tif` - Tagged Image File Format - `.dpx` - Digital Picture Exchange - `.hdr` - High Dynamic Range Image ### Document Formats - `.pdf` - Portable Document Format - `.txt` - Plain Text - `.doc`, `.docx` - Microsoft Word Document ### Archive Formats - `.zip` - ZIP Archive - `.rar` - RAR Archive - `.7z` - 7-Zip Archive ## File Size Limits - **Task Attachments**: 10MB maximum - **Work Submissions**: 500MB maximum ## API Endpoints ### File Upload Endpoints (via Tasks Router) #### Upload Task Attachment ``` POST /tasks/{task_id}/attachments ``` - Uploads a file attachment to a task - Creates thumbnail for image files - Returns attachment metadata with serving URLs #### Submit Work ``` POST /tasks/{task_id}/submit ``` - Submits work file for review - Automatically versions submissions - Updates task status to "submitted" ### File Serving Endpoints #### Serve Attachment ``` GET /files/attachments/{attachment_id} GET /files/attachments/{attachment_id}?thumbnail=true ``` - Serves attachment files with access control - Optional thumbnail parameter for image previews #### Serve Submission ``` GET /files/submissions/{submission_id} GET /files/submissions/{submission_id}?thumbnail=true ``` - Serves submission files with access control - Optional thumbnail parameter for image previews #### Stream Submission ``` GET /files/submissions/{submission_id}/stream ``` - Streams video files for playback - Supports range requests for efficient streaming #### File Information ``` GET /files/info/attachment/{attachment_id} GET /files/info/submission/{submission_id} ``` - Returns file metadata and information - Includes file type detection and existence status ## Directory Structure ``` backend/uploads/ ├── attachments/ │ └── {task_id}/ │ └── {unique_filename} ├── submissions/ │ └── {task_id}/ │ └── {versioned_filename} └── thumbnails/ └── {filename}_thumb.jpg ``` ## Access Control ### Permission Matrix | User Role | Own Tasks | Other Tasks | Review Access | |-------------|-----------|-------------|---------------| | Artist | ✓ | ✗ | ✗ | | Coordinator | ✓ | ✓ | ✓ | | Director | ✓ | ✓ | ✓ | | Admin | ✓ | ✓ | ✓ | ### Security Features - **Authentication required** for all file operations - **Role-based access control** for file serving - **File type validation** to prevent malicious uploads - **File size limits** to prevent abuse - **Unique filename generation** to prevent conflicts - **Path traversal protection** through controlled directory structure ## File Handler Utility The `FileHandler` class provides core functionality: ### Key Methods - `validate_file()` - Validates file format and size - `save_file()` - Saves uploaded file with unique naming - `delete_file()` - Removes file and associated thumbnail - `create_thumbnail()` - Generates image thumbnails - `get_file_info()` - Returns file metadata - `is_image_file()` / `is_video_file()` - File type detection ### Configuration ```python # File size limits MAX_ATTACHMENT_SIZE = 10 * 1024 * 1024 # 10MB MAX_SUBMISSION_SIZE = 500 * 1024 * 1024 # 500MB # Thumbnail settings THUMBNAIL_SIZE = (200, 200) THUMBNAIL_QUALITY = 85 ``` ## Usage Examples ### Frontend Integration ```javascript // Upload attachment const formData = new FormData(); formData.append('file', file); formData.append('attachment_type', 'reference'); formData.append('description', 'Reference image'); const response = await fetch(`/tasks/${taskId}/attachments`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` }, body: formData }); const attachment = await response.json(); console.log('Download URL:', attachment.download_url); console.log('Thumbnail URL:', attachment.thumbnail_url); ``` ```javascript // Submit work const formData = new FormData(); formData.append('file', workFile); formData.append('notes', 'Final version ready for review'); const response = await fetch(`/tasks/${taskId}/submit`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}` }, body: formData }); const submission = await response.json(); console.log('Stream URL:', submission.stream_url); ``` ## Error Handling ### Common Error Responses - `400 Bad Request` - Invalid file format or missing filename - `403 Forbidden` - Insufficient permissions to access file - `404 Not Found` - File or associated task not found - `413 Payload Too Large` - File exceeds size limits ### Error Response Format ```json { "detail": "File too large. Maximum size is 10MB" } ``` ## Performance Considerations - **Chunked streaming** for large video files - **On-demand thumbnail generation** with caching - **Efficient file serving** with proper MIME types - **Range request support** for video streaming ## Maintenance ### File Cleanup The system does not automatically clean up orphaned files. Consider implementing: - Periodic cleanup of files without database references - Archive old submissions after project completion - Monitor disk usage and implement retention policies ### Backup Considerations - Include upload directories in backup procedures - Consider separate backup strategy for large media files - Implement file integrity checks for critical submissions