Fayllarni yuklash (Multipart upload), saqlash va FileResponse orqali ko'chirib olish
10-sinfAdvanced Python Back-end3-hafta · 8-darsDasturchi fayllari va foydalanuvchi fayllari farqi, STATIC_ROOT va MEDIA_ROOT sozlamalari.
MultiPartParser, Pillow kutubxonasi, rasm formati va hajmini tekshirish.
Oqimli (streaming) fayl uzatish, xavfsiz download actionlari.
Fayllarning turlari va saqlanish o'rni
Dasturchi kodi bilan keladigan va foydalanuvchi yuklagan fayllar
# Statik fayllar (CSS, JS)
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR.parent / "staticfiles"
# Media fayllar (Uploads)
MEDIA_URL = "media/"
MEDIA_ROOT = BASE_DIR.parent / "media"
# src/config/urls.py (Development muhitda serve qilish)
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
Multipart/form-data va Pillow tekshiruvi
Mijozdan to server diskigacha bo'lgan yo'l
@action(
methods=["post"],
detail=True,
url_path="upload-cover",
parser_classes=[MultiPartParser, FormParser],
)
def upload_cover(self, request, slug=None):
post = self.get_object()
serializer = PostCoverUploadSerializer(post, data=request.data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
FileResponse va oqimli uzatish
@action(methods=["get"], detail=True, url_path="download-cover")
def download_cover(self, request, slug=None):
post = self.get_object()
if not post.cover_image:
raise Http404("Muqova rasmi topilmadi")
return FileResponse(
post.cover_image.open("rb"),
as_attachment=True,
filename=post.cover_image.name.split("/")[-1]
)
as_attachment=True parametri brauzerda rasmni shunchaki ko'rsatmasdan, kompyuterga yuklab olishni boshlaydi.
Bosing va tekshiring
Statik — dasturchi fayllari; Media — foydalanuvchi yuklagan fayllar.
Bosing va tekshiring
Rasmlar va hujjatlarni HTTP orqali uzatuvchi ikkilik kontent formati.
Bosing va tekshiring
Fayllarni server xotirasini band qilmasdan oqim shaklida yetkazadi.
Nima uchun rasmlarning o'zi ma'lumotlar bazasida emas, server diskida saqlanadi?
validate_cover_image orqali MIME turi va maksimal hajmni qat'iy tekshiring.
settings/base.py ga STATIC_ROOT va MEDIA_ROOT sozlamalarini kiriting.
PostCoverUploadSerializer klassini 5 MB va JPEG/PNG tekshiruvi bilan yozing.
upload_cover va download_cover actionlarini sinovdan o'tkazing.
Keyingi darsda: APIni avtomatlashtirilgan testlash va Swagger / ReDoc hujjatlashtirish!