50 lines
No EOL
1.5 KiB
Python
50 lines
No EOL
1.5 KiB
Python
from fastapi import FastAPI, UploadFile, Request, Depends
|
|
from fastapi.middleware.cors import CORSMiddleware
|
|
from minio import Minio
|
|
import mimetypes
|
|
import re
|
|
|
|
from .auth import JWTBearer
|
|
from .sql import SessionMaker, Uploads
|
|
from . import util
|
|
import config
|
|
from datetime import datetime, timedelta
|
|
|
|
|
|
minioClient = Minio(
|
|
config.MINIO_ADDR,
|
|
access_key=config.MINIO_ACCESS_KEY,
|
|
secret_key=config.MINIO_SECRET_KEY,
|
|
)
|
|
|
|
app = FastAPI()
|
|
app.add_middleware(
|
|
CORSMiddleware,
|
|
allow_origins=config.ALLOWED_DOMAINS,
|
|
allow_credentials=True,
|
|
allow_methods=["*"],
|
|
allow_headers=["*"],
|
|
)
|
|
|
|
@app.post("/upload", dependencies=[Depends(JWTBearer())])
|
|
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)
|
|
session = SessionMaker()
|
|
if existing := session.query(Uploads).where(Uploads.hash == sha).first():
|
|
existing.expiry = datetime.now() + timedelta(days=7)
|
|
else:
|
|
mime = mimetypes.guess_type(safeFilename)
|
|
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_ADDR}/uploads/{sha}/{safeFilename}"}
|
|
|
|
|
|
__all__ = ["sql", "auth", "util"] |