storage.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import os
  2. from fastapi import APIRouter, UploadFile, File, HTTPException
  3. from typing import List
  4. from app.core.config import settings
  5. from app.utils.file_ops import save_upload_file, delete_file
  6. router = APIRouter()
  7. @router.post("/upload", summary="上传图片 (Multipart)")
  8. async def upload_image(file: UploadFile = File(...)):
  9. """
  10. 接收文件上传,保存并返回可访问的 URL。
  11. 树莓派调用此接口。
  12. """
  13. if not file.content_type.startswith("image/"):
  14. raise HTTPException(status_code=400, detail="File must be an image")
  15. try:
  16. # 保存文件
  17. filename = await save_upload_file(file)
  18. # 拼接完整的 URL 地址
  19. file_url = f"{settings.BASE_URL}/static/{filename}"
  20. return {
  21. "status": "success",
  22. "filename": filename,
  23. "url": file_url
  24. }
  25. except Exception as e:
  26. raise HTTPException(status_code=500, detail=f"Upload failed: {str(e)}")
  27. # --- 赠送的实用接口 ---
  28. @router.get("/images", summary="列出所有已上传图片")
  29. async def list_images():
  30. """查看服务器上现在存了哪些图片 (调试用)"""
  31. if not os.path.exists(settings.UPLOAD_PATH):
  32. return []
  33. files = sorted(os.listdir(settings.UPLOAD_PATH), reverse=True) # 按时间倒序(假设文件名带时间戳)
  34. image_list = []
  35. for f in files:
  36. if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif')):
  37. image_list.append({
  38. "filename": f,
  39. "url": f"{settings.BASE_URL}/static/{f}"
  40. })
  41. return image_list
  42. @router.delete("/images/{filename}", summary="删除指定图片")
  43. async def delete_image(filename: str):
  44. """清理图片"""
  45. success = delete_file(filename)
  46. if not success:
  47. raise HTTPException(status_code=404, detail="File not found")
  48. return {"status": "deleted", "filename": filename}