UploadFile va File, fayl validatsiyasi (tur, hajm), xavfsiz saqlash, yuklab olish (FileResponse)
10-sinfAdvanced Python Back-end6-hafta · 16-darsFayl qabul qilish
Tur, hajm, nom
FileResponse
limit ga nima uchun yuqori chegara (le=100) qo'yamiz?
limit=1000000 bilan serverni yuklash mumkin.Fayl qabul qilish
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/books/{book_id}/cover")
async def upload_cover(book_id: int, file: UploadFile = File(...)):
data = await file.read()
return {"filename": file.filename,
"type": file.content_type,
"size": len(data)}
Body (JSON) bilan File ni aralashtirib bo'lmaydi: qo'shimcha maydonlar Form(...) bilan beriladi.Fayl yuklash uchun qaysi paket kerak?
python-multipart kerak.Tur, hajm, nom
ALLOWED = {"image/jpeg": ".jpg", "image/png": ".png"}
MAX_SIZE = 2 * 1024 * 1024
ext = ALLOWED.get(file.content_type)
if ext is None:
raise HTTPException(415, "Faqat JPEG yoki PNG")
data = await file.read(MAX_SIZE + 1)
if len(data) > MAX_SIZE:
raise HTTPException(413, "Fayl 2 MB dan katta")
name = f"{book_id}_{uuid4().hex}{ext}"
(UPLOAD_DIR / name).write_bytes(data)
content_type ni mijoz yuboradi, uni soxtalashtirish mumkin: jiddiy loyihada fayl sarlavhasi (magic bytes) ham tekshiriladi.Fayl hajmi chegaradan oshsa qaysi status qaytariladi?
FileResponse
@app.get("/files/{name}")
async def download(name: str):
path = (UPLOAD_DIR / name).resolve()
if path.parent != UPLOAD_DIR.resolve() or not path.is_file():
raise HTTPException(404, "Fayl topilmadi")
return FileResponse(path)
get_current_user bilan egasini ham tekshiring.Path traversal nima?
filename va content_type borFayl uchun UploadFile tavsiya etiladi.
Yuklangan faylni ifodalovchi obyekt
Fayl yuboriladigan so'rov formati
Fayl juda katta
Fayl turi qo'llab-quvvatlanmaydi
UploadFile = File(...).
Tur va hajm.
uuid4 nomi bilan.
| Holat | Status | Sabab |
|---|---|---|
| Tur noto'g'ri | 415 | ruxsat etilmagan content_type |
| Hajm katta | 413 | MAX_SIZE dan oshdi |
| Fayl yo'q | 404 | yo'l noto'g'ri |
| Muvaffaqiyat | 201 | fayl saqlandi |
| Fayl yuborilmadi | 422 | file maydoni yo'q |
Pastga bosing: statuslar
uvicorn app.main:app --reload ni ishga tushiring./docs da POST /books/1/cover ga PNG yuklang./files/<nom> bilan yuklab oling; .txt bilan 415 ni tekshiring.
path = UPLOAD_DIR / file.filename
path = UPLOAD_DIR / f"{uuid4().hex}.png"
Foydalanuvchi yuborgan hamma narsani tekshiring.
/upload endpointi yozing: fayl nomi va hajmini qaytarsin.uuid4 nomi bilan saqlang./files/{name} endpointini path traversal dan himoyalab yozing.Book.cover maydoniga fayl nomini yozing.UploadFile = File(...), python-multipart.
Tur (415), hajm (413), uuid4 nomi.
FileResponse va path traversal himoyasi.
Uyga vazifa: Fayl yuklash va yuklab olish.
Struktura, sozlamalar, xatolar
6-hafta · 17-dars