files.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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)
  19. db_file_path = f"uploads/{unique_filename}"
  20. sha256_hash = hashlib.sha256()
  21. with open(file_path, "wb") as buffer:
  22. while chunk := file.file.read(8192):
  23. sha256_hash.update(chunk)
  24. buffer.write(chunk)
  25. filament_g = None
  26. print_time = None
  27. if config.SYNC_SLICING_ON_UPLOAD and file_ext.lower() == ".stl":
  28. import slicer_utils
  29. result = slicer_utils.slice_model(file_path)
  30. if result and result.get('success'):
  31. filament_g = result.get('filament_g')
  32. print_time = result.get('print_time_str')
  33. preview_path = None
  34. db_preview_path = None
  35. if file_ext.lower() == ".stl":
  36. preview_filename = f"{uuid.uuid4()}.png"
  37. preview_path = os.path.join(config.PREVIEW_DIR, preview_filename)
  38. db_preview_path = f"uploads/previews/{preview_filename}"
  39. preview_utils.generate_stl_preview(file_path, preview_path)
  40. 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)"
  41. f_id = db.execute_commit(query, (file.filename, db_file_path, file.size, sha256_hash.hexdigest(), print_time, filament_g, db_preview_path))
  42. uploaded_data.append({
  43. "id": f_id, "filename": file.filename, "size": file.size,
  44. "print_time": print_time, "filament_g": filament_g, "preview_path": db_preview_path
  45. })
  46. return {"uploaded": uploaded_data}