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
- Giriş
- Gereksinimler
- Kurulum
- Temel FastAPI Uygulaması Oluşturma
- Tekli Dosya Yükleme
- Çoklu Dosya Yükleme
- Dosya Boyutu Sınırlandırması
- Dosya Türü Kontrolü
- Örnek Kod
- Güvenlik Hususları
- 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.