files.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import os
  2. import uuid
  3. import hashlib
  4. from fastapi import APIRouter, UploadFile, File
  5. from typing import List
  6. import db
  7. import config
  8. import preview_utils
  9. router = APIRouter(prefix="/files", tags=["files"])
  10. @router.post("/upload")
  11. async def upload_files(files: List[UploadFile] = File(...)):
  12. if not files: return {"uploaded": []}
  13. uploaded_data = []
  14. for file in files:
  15. if not file.filename: continue
  16. file_ext = os.path.splitext(file.filename)[1]
  17. unique_filename = f"{uuid.uuid4()}{file_ext}"
  18. file_path = os.path.join(config.UPLOAD_DIR, unique_filename).replace("\\", "/")
  19. sha256_hash = hashlib.sha256()
  20. with open(file_path, "wb") as buffer:
  21. while chunk := file.file.read(8192):
  22. sha256_hash.update(chunk)
  23. buffer.write(chunk)
  24. filament_g = None
  25. print_time = None
  26. if config.SYNC_SLICING_ON_UPLOAD and file_ext.lower() == ".stl":
  27. import slicer_utils
  28. result = slicer_utils.slice_model(file_path)
  29. if result and result.get('success'):
  30. filament_g = result.get('filament_g')
  31. print_time = result.get('print_time_str')
  32. preview_path = None
  33. if file_ext.lower() == ".stl":
  34. preview_filename = f"{uuid.uuid4()}.png"
  35. preview_path = os.path.join(config.PREVIEW_DIR, preview_filename).replace("\\", "/")
  36. preview_utils.generate_stl_preview(file_path, preview_path)
  37. 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)"
  38. f_id = db.execute_commit(query, (file.filename, file_path, file.size, sha256_hash.hexdigest(), print_time, filament_g, preview_path))
  39. uploaded_data.append({
  40. "id": f_id, "filename": file.filename, "size": file.size,
  41. "print_time": print_time, "filament_g": filament_g, "preview_path": preview_path
  42. })
  43. return {"uploaded": uploaded_data}