FastAPI ile Çoklu Dosya Yükleme: Kapsamlı Rehber






FastAPI ile Çoklu Dosya Yükleme: Kapsamlı Rehber


FastAPI ile Çoklu Dosya Yükleme: Kapsamlı Rehber

FastAPI, modern ve hızlı API’ler oluşturmak için kullanılan popüler bir Python framework’üdür. Bu makalede, FastAPI kullanarak nasıl çoklu dosya yükleme işlemlerini gerçekleştireceğinizi adım adım öğreneceksiniz.

İçindekiler

  1. Giriş
  2. Gereksinimler
  3. Kurulum
  4. Temel FastAPI Uygulaması Oluşturma
  5. Tekli Dosya Yükleme
  6. Çoklu Dosya Yükleme
  7. Dosya Boyutu Sınırlandırması
  8. Dosya Türü Kontrolü
  9. Örnek Kod
  10. Güvenlik Hususları
  11. Sonuç

Giriş

Çoklu dosya yükleme, web uygulamalarında yaygın bir gereksinimdir. Kullanıcıların aynı anda birden fazla dosyayı sunucuya yüklemesine olanak tanır. FastAPI, bu işlemi basit ve verimli bir şekilde gerçekleştirmenizi sağlar.

Gereksinimler

Bu makaledeki örnekleri takip etmek için aşağıdaki gereksinimlere sahip olmanız gerekir:

  • Python 3.7 veya üzeri
  • pip (Python paket yöneticisi)
  • FastAPI kütüphanesi
  • uvicorn (ASGI sunucusu)

Kurulum

Gerekli kütüphaneleri pip kullanarak yükleyin:

pip install fastapi uvicorn python-multipart

python-multipart kütüphanesi, form verileri ve dosya yüklemeleri için gereklidir.

Temel FastAPI Uygulaması Oluşturma

İlk olarak, temel bir FastAPI uygulaması oluşturalım:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Merhaba Dünya!"}

Bu kodu main.py adlı bir dosyaya kaydedin ve uygulamayı çalıştırmak için aşağıdaki komutu kullanın:

uvicorn main:app --reload

Uygulama http://localhost:8000 adresinde çalışacaktır.

Tekli Dosya Yükleme

Tek bir dosya yüklemek için File ve UploadFile tiplerini kullanabilirsiniz:

from fastapi import FastAPI, File, UploadFile

app = FastAPI()

@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
    return {"filename": file.filename}

Bu endpoint, tek bir dosyayı kabul eder ve dosya adını geri döndürür.

Çoklu Dosya Yükleme

Birden fazla dosyayı yüklemek için, UploadFile tipini bir liste olarak tanımlayın:

from fastapi import FastAPI, File, UploadFile
from typing import List

app = FastAPI()

@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile]):
    return {"filenames": [file.filename for file in files]}

Bu endpoint, bir dosya listesini kabul eder ve her bir dosyanın adını içeren bir liste geri döndürür.

Dosya Boyutu Sınırlandırması

Dosya boyutunu sınırlandırmak için, dosyayı okurken bir kontrol ekleyebilirsiniz:

from fastapi import FastAPI, File, UploadFile, HTTPException
from typing import List

app = FastAPI()

@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile]):
    for file in files:
        if file.size > 1024 * 1024:  # 1MB sınır
            raise HTTPException(status_code=400, detail="Dosya boyutu çok büyük")
        # Dosyayı kaydetme işlemleri burada yapılabilir
    return {"filenames": [file.filename for file in files]}

Bu örnekte, dosya boyutu 1MB ile sınırlandırılmıştır.

Dosya Türü Kontrolü

Dosya türünü kontrol etmek için, dosyanın content_type özelliğini kullanabilirsiniz:

from fastapi import FastAPI, File, UploadFile, HTTPException
from typing import List

app = FastAPI()

@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile]):
    for file in files:
        if file.content_type not in ["image/jpeg", "image/png"]:  # Sadece JPEG ve PNG
            raise HTTPException(status_code=400, detail="Geçersiz dosya türü")
        # Dosyayı kaydetme işlemleri burada yapılabilir
    return {"filenames": [file.filename for file in files]}

Bu örnekte, sadece JPEG ve PNG dosyalarına izin verilmektedir.

Örnek Kod

Aşağıdaki örnek kod, çoklu dosya yükleme, boyut sınırlandırması ve dosya türü kontrolünü bir araya getirmektedir:

from fastapi import FastAPI, File, UploadFile, HTTPException
from typing import List
import os

app = FastAPI()

UPLOAD_DIRECTORY = "./uploads"

if not os.path.exists(UPLOAD_DIRECTORY):
    os.makedirs(UPLOAD_DIRECTORY)

@app.post("/uploadfiles/")
async def create_upload_files(files: List[UploadFile]):
    filenames = []
    for file in files:
        if file.size > 1024 * 1024 * 5:  # 5MB sınır
            raise HTTPException(status_code=400, detail="Dosya boyutu çok büyük")
        if file.content_type not in ["image/jpeg", "image/png", "application/pdf"]:  # JPEG, PNG ve PDF
            raise HTTPException(status_code=400, detail="Geçersiz dosya türü")

        file_path = os.path.join(UPLOAD_DIRECTORY, file.filename)
        try:
            with open(file_path, "wb") as f:
                while contents := await file.read(1024 * 1024):
                    f.write(contents)
        except Exception:
            return {"message": "Dosya yüklenirken bir hata oluştu"}
        finally:
            await file.close()

        filenames.append(file.filename)

    return {"filenames": filenames, "message": "Dosyalar başarıyla yüklendi"}

Bu kod, dosyaları ./uploads dizinine kaydeder ve 5MB boyut sınırını ve JPEG, PNG ve PDF dosya türü kontrolünü uygular.

Güvenlik Hususları

Dosya yükleme işlemleri sırasında dikkat edilmesi gereken bazı güvenlik hususları şunlardır:

  • Dosya adlarını temizleyin ve güvenli hale getirin. Kullanıcı tarafından sağlanan dosya adlarını doğrudan kullanmaktan kaçının.
  • Yüklenen dosyaların türünü ve içeriğini doğrulayın. Zararlı kod içerebilecek dosyaları engelleyin.
  • Dosyaları güvenli bir dizinde saklayın ve erişim izinlerini doğru şekilde yapılandırın.
  • Dosya boyutunu sınırlandırın.

Sonuç

Bu makalede, FastAPI kullanarak çoklu dosya yükleme işlemlerini nasıl gerçekleştireceğinizi öğrendiniz. Dosya boyutu sınırlandırması, dosya türü kontrolü ve güvenlik hususları gibi önemli konulara değindik. FastAPI’nin esnekliği ve kolay kullanımı sayesinde, dosya yükleme işlemlerini web uygulamalarınıza kolayca entegre edebilirsiniz.


Leave A Comment

Your email address will not be published. Required fields are marked *