6.4 KiB
6.4 KiB
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 sizesave_file()- Saves uploaded file with unique namingdelete_file()- Removes file and associated thumbnailcreate_thumbnail()- Generates image thumbnailsget_file_info()- Returns file metadatais_image_file()/is_video_file()- File type detection
Configuration
# 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
// 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);
// 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 filename403 Forbidden- Insufficient permissions to access file404 Not Found- File or associated task not found413 Payload Too Large- File exceeds size limits
Error Response Format
{
"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