# Mercedes-Benz MYP - File Management System ## Übersicht Das MYP File Management System bietet eine organisierte, sichere und skalierbare Lösung für das Hochladen, Speichern und Verwalten von Dateien in der Mercedes-Benz MYP Platform. ## Verzeichnisstruktur Das System organisiert alle hochgeladenen Dateien in einer strukturierten Hierarchie: ``` uploads/ ├── jobs/ # Druckjob-Dateien │ ├── 2025/ │ │ ├── 01/ │ │ │ ├── user_1/ │ │ │ ├── user_2/ │ │ │ └── ... │ │ ├── 02/ │ │ └── ... │ └── 2024/ ├── guests/ # Gastauftrags-Dateien │ ├── 2025/ │ │ ├── 01/ │ │ └── ... │ └── 2024/ ├── avatars/ # Benutzer-Avatare │ ├── 2025/ │ │ ├── 01/ │ │ │ ├── user_1/ │ │ │ ├── user_2/ │ │ │ └── ... │ │ └── ... │ └── 2024/ ├── temp/ # Temporäre Dateien ├── backups/ # Backup-Dateien ├── logs/ # Exportierte Logs └── assets/ # Statische Assets ``` ## Benennungskonventionen ### Dateinamen-Schema Alle hochgeladenen Dateien erhalten automatisch einen eindeutigen Namen: ``` {prefix}_{original_name}_{timestamp}.{extension} ``` **Beispiele:** - `job_Druckteil_v2_20250529_143052.stl` - `guest_Prototyp_20250529_143052.gcode` - `avatar_profilbild_20250529_143052.jpg` ### Verzeichnis-Organisation - **Jahr/Monat-Struktur**: `YYYY/MM/` - **Benutzer-spezifisch**: `user_{user_id}/` für persönliche Dateien - **Kategorie-basiert**: Trennung nach Dateityp und Verwendungszweck ## API-Endpunkte ### File Upload #### Job-Datei hochladen ```http POST /api/upload/job Content-Type: multipart/form-data Form Data: - file: Die hochzuladende Datei - job_name: Name des Jobs (optional) ``` **Antwort:** ```json { "success": true, "message": "Datei erfolgreich hochgeladen", "file_path": "jobs/2025/01/user_1/job_Druckteil_20250529_143052.stl", "filename": "Druckteil.stl", "unique_filename": "job_Druckteil_20250529_143052.stl", "file_size": 1048576, "metadata": { "original_filename": "Druckteil.stl", "uploader_id": 1, "uploader_name": "max.mustermann", "upload_timestamp": "2025-05-29T14:30:52.123456" } } ``` #### Gastauftrag-Datei hochladen ```http POST /api/upload/guest Content-Type: multipart/form-data Form Data: - file: Die hochzuladende Datei - guest_name: Name des Gasts (optional) - guest_email: E-Mail des Gasts (optional) ``` #### Avatar hochladen ```http POST /api/upload/avatar Content-Type: multipart/form-data Form Data: - file: Das Avatar-Bild (PNG, JPG, JPEG, GIF, WebP) ``` ### File Access #### Datei abrufen ```http GET /api/files/{file_path} ``` **Zugriffskontrolle:** - **Job-Dateien**: Nur Besitzer und Administratoren - **Gast-Dateien**: Nur Administratoren - **Avatar-Dateien**: Alle angemeldeten Benutzer - **Andere Dateien**: Nur Administratoren #### Datei löschen ```http DELETE /api/files/{file_path} ``` ### Admin-Funktionen #### Datei-Statistiken abrufen ```http GET /api/admin/files/stats ``` **Antwort:** ```json { "success": true, "categories": { "jobs": { "file_count": 45, "total_size": 52428800, "total_size_mb": 50.0 }, "guests": { "file_count": 12, "total_size": 10485760, "total_size_mb": 10.0 } }, "totals": { "file_count": 57, "total_size": 62914560, "total_size_mb": 60.0 } } ``` #### Temporäre Dateien aufräumen ```http POST /api/admin/files/cleanup Content-Type: application/json { "max_age_hours": 24 } ``` ## Sicherheitsfeatures ### Dateityp-Validierung Das System erlaubt nur spezifische Dateitypen: ```python ALLOWED_EXTENSIONS = { 'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'gcode', '3mf', 'stl', 'webp' } ``` ### Dateigrößen-Limits - **Standard-Maximum**: 16 MB - **Konfigurierbar** über `MAX_CONTENT_LENGTH` ### Zugriffskontrolle - **Benutzer-spezifische Isolation**: Benutzer können nur auf ihre eigenen Dateien zugreifen - **Admin-Privilegien**: Administratoren haben Vollzugriff - **Kategorie-basierte Beschränkungen**: Verschiedene Regeln für verschiedene Dateitypen ### Sichere Dateinamen - **Werkzeug.secure_filename()**: Entfernt schädliche Zeichen - **Eindeutige Timestamps**: Verhindert Namenskonflikte - **Präfix-System**: Kategorisierung und Identifikation ## Verwendung im Code ### FileManager Klasse ```python from utils.file_manager import file_manager # Datei speichern result = file_manager.save_file( file=uploaded_file, category='jobs', user_id=user.id, prefix='job', metadata={'job_name': 'Prototyp v1'} ) if result: relative_path, absolute_path, metadata = result # Pfad in Datenbank speichern job.file_path = relative_path ``` ### Convenience-Funktionen ```python from utils.file_manager import save_job_file, save_guest_file, save_avatar_file # Job-Datei speichern result = save_job_file(file, user_id, metadata) # Gast-Datei speichern result = save_guest_file(file, metadata) # Avatar speichern result = save_avatar_file(file, user_id) ``` ### Datei-Operationen ```python from utils.file_manager import delete_file, get_file_info # Datei löschen success = delete_file('jobs/2025/01/user_1/job_test_20250529_143052.stl') # Datei-Informationen abrufen info = get_file_info('jobs/2025/01/user_1/job_test_20250529_143052.stl') if info: print(f"Dateigröße: {info['size']} Bytes") print(f"Erstellt: {info['created']}") ``` ## Wartung und Monitoring ### Automatische Bereinigung Das System bietet automatische Bereinigung von temporären Dateien: ```python # Dateien älter als 24 Stunden löschen deleted_count = file_manager.cleanup_temp_files(max_age_hours=24) ``` ### Statistiken und Monitoring ```python # Kategorie-Statistiken abrufen stats = file_manager.get_category_stats() for category, info in stats.items(): print(f"{category}: {info['file_count']} Dateien, {info['total_size_mb']} MB") ``` ### Datei-Migration ```python # Datei in andere Kategorie verschieben new_path = file_manager.move_file( old_relative_path='temp/file.stl', new_category='jobs', new_prefix='job' ) ``` ## Error Handling Das System implementiert umfassendes Error Handling: ### Häufige Fehler 1. **Ungültiger Dateityp** ```json {"error": "Dateityp nicht erlaubt: example.exe"} ``` 2. **Datei zu groß** ```json {"error": "Datei überschreitet maximale Größe von 16 MB"} ``` 3. **Unbekannte Kategorie** ```json {"error": "Unbekannte Kategorie: invalid_category"} ``` 4. **Zugriff verweigert** ```json {"error": "Zugriff verweigert"} ``` ### Logging Alle Datei-Operationen werden vollständig geloggt: ``` 2025-05-29 14:30:52 - [APP] - INFO - Job-Datei hochgeladen: Prototyp.stl von User 1 2025-05-29 14:31:15 - [APP] - INFO - Datei gelöscht: jobs/.../old_file.stl von User 1 2025-05-29 14:32:00 - [APP] - INFO - Temporäre Dateien aufgeräumt: 5 Dateien gelöscht ``` ## Performance-Optimierungen ### Async Operations - **Non-blocking File I/O**: Datei-Operationen blockieren nicht die Hauptanwendung - **Background Cleanup**: Automatische Bereinigung läuft im Hintergrund ### Storage Efficiency - **Komprimierung**: Automatische Komprimierung für bestimmte Dateitypen - **Deduplizierung**: Vermeidung von Duplikaten durch Hash-Vergleich - **Archivierung**: Alte Dateien werden automatisch archiviert ### Caching - **Metadata Caching**: Datei-Metadaten werden gecacht - **Path Resolution**: Schnelle Pfad-Auflösung ## Konfiguration ### Umgebungsvariablen ```env MYP_UPLOAD_FOLDER=/path/to/uploads MYP_MAX_FILE_SIZE=16777216 # 16 MB in Bytes MYP_ALLOWED_EXTENSIONS=stl,gcode,3mf,jpg,png MYP_AUTO_CLEANUP_HOURS=24 ``` ### settings.py ```python UPLOAD_FOLDER = os.path.join(BASE_DIR, "uploads") ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'gcode', '3mf', 'stl'} MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16MB ``` ## Integration mit Frontend ### JavaScript Upload ```javascript async function uploadJobFile(file, jobName) { const formData = new FormData(); formData.append('file', file); formData.append('job_name', jobName); const response = await fetch('/api/upload/job', { method: 'POST', body: formData, headers: { 'X-CSRFToken': csrfToken } }); return await response.json(); } ``` ### Progress Tracking ```javascript function uploadWithProgress(file, onProgress) { return new Promise((resolve, reject) => { const xhr = new XMLHttpRequest(); const formData = new FormData(); formData.append('file', file); xhr.upload.addEventListener('progress', (e) => { if (e.lengthComputable) { const percentComplete = (e.loaded / e.total) * 100; onProgress(percentComplete); } }); xhr.addEventListener('load', () => { resolve(JSON.parse(xhr.responseText)); }); xhr.open('POST', '/api/upload/job'); xhr.send(formData); }); } ``` ## Best Practices ### Für Entwickler 1. **Immer Dateityp validieren** vor dem Upload 2. **Benutzer-spezifische Pfade verwenden** für persönliche Dateien 3. **Metadaten speichern** für bessere Nachverfolgbarkeit 4. **Error Handling implementieren** für alle Datei-Operationen 5. **Cleanup-Routinen verwenden** für temporäre Dateien ### Für Administratoren 1. **Regelmäßige Backups** der Upload-Verzeichnisse 2. **Monitoring der Speichernutzung** 3. **Periodische Bereinigung** alter Dateien 4. **Sicherheitsscans** auf schädliche Dateien 5. **Access-Log-Überwachung** ## Troubleshooting ### Häufige Probleme #### Upload schlägt fehl ```bash # Verzeichnis-Berechtigungen prüfen ls -la uploads/ chmod 755 uploads/ chown -R www-data:www-data uploads/ ``` #### Dateien nicht gefunden ```bash # FileManager initialisieren python -c "from utils.file_manager import file_manager; file_manager.ensure_directories()" ``` #### Speicher voll ```bash # Cleanup ausführen curl -X POST http://localhost:8443/api/admin/files/cleanup \ -H "Content-Type: application/json" \ -d '{"max_age_hours": 1}' ``` ## Changelog ### Version 1.0.0 (2025-05-29) - ✅ **Grundlegendes File Management System** - ✅ **Organisierte Verzeichnisstruktur** - ✅ **Sicherheits-Features** - ✅ **API-Endpunkte für Upload/Download** - ✅ **Admin-Tools für Verwaltung** - ✅ **Umfassende Dokumentation** ## Roadmap ### Version 1.1.0 (geplant) - 🔄 **Datei-Versionierung** - 🔄 **Erweiterte Metadaten** - 🔄 **Automatische Bildoptimierung** - 🔄 **Virus-Scanning Integration** ### Version 1.2.0 (geplant) - 🔄 **Cloud Storage Integration** - 🔄 **CDN Support** - 🔄 **Advanced Caching** - 🔄 **Datei-Sharing Features**