29 lines
1.1 KiB
Python
29 lines
1.1 KiB
Python
from . import router
|
|
from fastapi import UploadFile, Request, Depends
|
|
from ..sql import SessionMaker, Uploads
|
|
from datetime import datetime, timedelta
|
|
from .. import util
|
|
from ..auth import JWTBearer
|
|
import config
|
|
import mimetypes
|
|
|
|
|
|
@router.post("/upload", dependencies=[Depends(JWTBearer(False))])
|
|
async def upload(file: UploadFile, request: Request):
|
|
if file.size > config.MAX_FILE_SIZE:
|
|
return {"error": "file too big"}
|
|
spl = file.filename.rsplit(".", 1)
|
|
safeFilename = util.safeName.sub("_", spl[0])
|
|
if len(spl) == 2:
|
|
safeFilename += "." + util.safeName.sub("_", spl[1])
|
|
sha = await util.SHA256(file)
|
|
with SessionMaker() as session:
|
|
if existing := session.query(Uploads).where(Uploads.hash == sha).first():
|
|
existing.expiry = datetime.now() + timedelta(days=7)
|
|
else:
|
|
mime = mimetypes.guess_type(safeFilename)
|
|
util.minioClient.put_object("uploads", sha, file.file, file.size, content_type=mime[0])
|
|
up = Uploads(hash=sha)
|
|
session.add(up)
|
|
session.commit()
|
|
return {"url": f"https://{config.MINIO_EXTERNAL_ADDR}/uploads/{sha}/{safeFilename}"}
|