files.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import io
  2. import json
  3. import time
  4. from datetime import datetime, timedelta, timezone
  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.delete("/dag")
  18. @web_try()
  19. @sxtimeit
  20. def delete_dag_file(uri: str,db: Session = Depends(get_db)):
  21. res = crud.get_jm_homework_by_dag_url(db,uri)
  22. if len(res) == 0:
  23. minio_client.del_file(uri)
  24. else:
  25. raise Exception("该算子正在被作业使用,不可删除")
  26. @router.post("/upload_file")
  27. @web_try()
  28. @sxtimeit
  29. def upload_file(file: UploadFile = File(...), project_id: str=Form(...), file_type: str=Form(...)):
  30. print("UploadFile-->",file.filename)
  31. file_name = str(int(time.time()))+'_'+file.filename
  32. url = minio_client.put_byte_file(f"{project_id}/{file_type}/"+file_name, file.file.read())
  33. return url
  34. @router.get("/directory")
  35. @web_try()
  36. @sxtimeit
  37. def get_directory(project_id: str, user_id: str, file_type: str):
  38. files = minio_client.ls_file(f'{project_id}/{file_type}/')
  39. res = []
  40. td = timedelta(hours=8)
  41. tz = timezone(td)
  42. for file in files:
  43. timestamp = file.object_name.split('_',1)[0].split('/')[-1]
  44. dt = datetime.fromtimestamp(int(timestamp), tz)
  45. time_str = dt.strftime('%Y-%m-%d %H:%M:%S')
  46. dag_name = file.object_name.split('_',1)[1]
  47. res.append({'name':time_str+'-'+dag_name, 'uri':file.object_name,'timestamp':timestamp})
  48. res.sort(key=lambda x: x['timestamp'],reverse=True)
  49. return res
  50. @router.get("/dag_content")
  51. @sxtimeit
  52. @web_try()
  53. def get_dag_content(uri: str):
  54. file = minio_client.get_file(uri)
  55. if len(file) == 0:
  56. raise Exception('No file found')
  57. res = json.loads(file)
  58. return res
  59. # 此接口置于末尾,勿乱动,乱动者砍死
  60. @router.get("/{uri:path}",name="path-convertor")
  61. @sxtimeit
  62. def get_file(uri: str):
  63. file = minio_client.get_file(uri)
  64. code = 200
  65. if len(file) == 0:
  66. code = 404
  67. response = StreamingResponse(io.BytesIO(file), status_code=code, media_type="application/octet-stream")
  68. # 在请求头进行配置
  69. response.headers["Content-Disposition"] = "attachment; filename="+uri
  70. return response