| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- import os
- import uuid
- import hashlib
- from fastapi import APIRouter, UploadFile, File
- from typing import List
- import db
- import config
- import preview_utils
- router = APIRouter(prefix="/files", tags=["files"])
- @router.post("/upload")
- async def upload_files(files: List[UploadFile] = File(...)):
- if not files: return {"uploaded": []}
- uploaded_data = []
- for file in files:
- if not file.filename: continue
- file_ext = os.path.splitext(file.filename)[1]
- unique_filename = f"{uuid.uuid4()}{file_ext}"
- file_path = os.path.join(config.UPLOAD_DIR, unique_filename).replace("\\", "/")
-
- sha256_hash = hashlib.sha256()
- with open(file_path, "wb") as buffer:
- while chunk := file.file.read(8192):
- sha256_hash.update(chunk)
- buffer.write(chunk)
-
- filament_g = None
- print_time = None
- if config.SYNC_SLICING_ON_UPLOAD and file_ext.lower() == ".stl":
- import slicer_utils
- result = slicer_utils.slice_model(file_path)
- if result and result.get('success'):
- filament_g = result.get('filament_g')
- print_time = result.get('print_time_str')
-
- preview_path = None
- if file_ext.lower() == ".stl":
- preview_filename = f"{uuid.uuid4()}.png"
- preview_path = os.path.join(config.PREVIEW_DIR, preview_filename).replace("\\", "/")
- preview_utils.generate_stl_preview(file_path, preview_path)
- query = "INSERT INTO order_files (order_id, filename, file_path, file_size, quantity, file_hash, print_time, filament_g, preview_path) VALUES (NULL, %s, %s, %s, 1, %s, %s, %s, %s)"
- f_id = db.execute_commit(query, (file.filename, file_path, file.size, sha256_hash.hexdigest(), print_time, filament_g, preview_path))
-
- uploaded_data.append({
- "id": f_id, "filename": file.filename, "size": file.size,
- "print_time": print_time, "filament_g": filament_g, "preview_path": preview_path
- })
- return {"uploaded": uploaded_data}
|