files.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import io
  2. import json
  3. import time
  4. import uuid
  5. import app.crud as crud
  6. from fastapi import APIRouter, File, UploadFile, Form, Depends
  7. from sqlalchemy.orm import Session
  8. from fastapi.responses import StreamingResponse
  9. from utils.sx_time import sxtimeit
  10. from utils.sx_web import web_try
  11. from app.common.minio import minio_client
  12. from app import get_db
  13. router = APIRouter(
  14. prefix="/jpt/files",
  15. tags=["files-文件管理"],
  16. )
  17. @router.get("/")
  18. @sxtimeit
  19. def get_file(uri: str):
  20. file = minio_client.get_file(uri)
  21. code = 200
  22. if len(file) == 0:
  23. code = 404
  24. response = StreamingResponse(io.BytesIO(file), status_code=code, media_type="application/octet-stream")
  25. # 在请求头进行配置
  26. response.headers["Content-Disposition"] = "attachment; filename="+uri
  27. return response
  28. @router.delete("/")
  29. @web_try()
  30. @sxtimeit
  31. def delete_file(uri: str,db: Session = Depends(get_db)):
  32. res = crud.get_jm_homework_by_dag_url(db,uri)
  33. if len(res) == 0:
  34. minio_client.del_file(uri)
  35. else:
  36. raise Exception("该算子正在被作业使用,不可删除")
  37. @router.post("/upload_file")
  38. @web_try()
  39. @sxtimeit
  40. def upload_file(file: UploadFile = File(...), project_id: str=Form(...), file_type: str=Form(...)):
  41. print("UploadFile-->",file.filename)
  42. file_name = str(int(time.time()))+'_'+file.filename
  43. url = minio_client.put_byte_file(f"{project_id}/{file_type}/"+file_name, file.file.read())
  44. return url
  45. @router.get("/directory")
  46. @web_try()
  47. @sxtimeit
  48. def get_directory(project_id: str, user_id: str, file_type: str):
  49. files = minio_client.ls_file(f'{project_id}/{file_type}/')
  50. res = []
  51. for file in files:
  52. timestamp = file.object_name.split('_',1)[0].split('/')[-1]
  53. time_str = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(timestamp)))
  54. dag_name = file.object_name.split('_',1)[1]
  55. res.append({'name':time_str+'-'+dag_name, 'uri':file.object_name,'timestamp':timestamp})
  56. res.sort(key=lambda x: x['timestamp'],reverse=True)
  57. return res
  58. @router.get("/dag_content")
  59. @sxtimeit
  60. @web_try()
  61. def get_dag_content(uri: str):
  62. file = minio_client.get_file(uri)
  63. if len(file) == 0:
  64. raise Exception('No file found')
  65. res = json.loads(file)
  66. return res