FastAPI তে File এবং Image Upload কনফিগার করা অত্যন্ত সহজ। আপনি UploadFile এবং File ক্লাস ব্যবহার করে ফাইল বা ছবি আপলোড করতে পারেন। এটি বিশেষভাবে ওয়েব অ্যাপ্লিকেশনে ফাইল বা ইমেজ হ্যান্ডলিংয়ের জন্য খুবই কার্যকরী। এখানে আমরা দেখব কিভাবে FastAPI তে ফাইল এবং ছবি আপলোড কনফিগার করা যায়।
Step 1: Install Required Libraries
ফাস্টএপিআই তে ফাইল আপলোডের জন্য python-multipart প্যাকেজটি ইনস্টল করতে হবে। এটি ফর্ম ডাটা (যেমন ফাইল) প্রসেস করতে সাহায্য করে।
pip install python-multipart
Step 2: File Upload Example
FastAPI-তে ফাইল আপলোড করার জন্য UploadFile এবং File ক্লাস ব্যবহার করা হয়। UploadFile আপনাকে একটি file-like অবজেক্ট প্রদান করে, যা ফাইলের মেটাডেটা (যেমন ফাইলের নাম, কনটেন্ট টাইপ) অ্যাক্সেস করতে সক্ষম।
উদাহরণ: File Upload
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import shutil
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
file_location = f"files/{file.filename}"
with open(file_location, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
return {"filename": file.filename}
এখানে:
UploadFile: ফাইল আপলোডের জন্য ব্যবহৃত ক্লাস।File(...): ফাইলটি প্রয়োজনীয় হিসেবে চিহ্নিত করে।
এটি একটি সাধারণ ফাইল আপলোডের উদাহরণ, যেখানে আপলোড করা ফাইল files/ ফোল্ডারে সংরক্ষণ করা হয়।
রিকোয়েস্ট উদাহরণ:
POST /uploadfile/
ফর্ম ডাটা:
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
<input type="file" name="file">
<input type="submit">
</form>
Step 3: Image Upload Example
ফাস্টএপিআই তে Image Upload খুব সহজেই করা যায়, কারণ ফাইলের সাথে কোন ধরনের ফরম্যাট (যেমন PNG, JPEG) এর সাথে কাজ করা যায়। একইভাবে, UploadFile ক্লাস ব্যবহার করে ইমেজ আপলোড করা যেতে পারে।
উদাহরণ: Image Upload
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import shutil
app = FastAPI()
@app.post("/uploadimage/")
async def upload_image(image: UploadFile = File(...)):
image_location = f"images/{image.filename}"
with open(image_location, "wb") as buffer:
shutil.copyfileobj(image.file, buffer)
return {"filename": image.filename}
এখানে:
UploadFile: ইমেজ ফাইলের মতোfileহ্যান্ডলিং এর জন্য ব্যবহৃত হয়।shutil.copyfileobj(): ইমেজ ফাইলটি সেভ করার জন্য ব্যবহৃত হয়।
রিকোয়েস্ট উদাহরণ:
POST /uploadimage/
ফর্ম ডাটা:
<form action="/uploadimage/" enctype="multipart/form-data" method="post">
<input type="file" name="image">
<input type="submit">
</form>
Step 4: Validate File Type (File Validation)
ফাস্টএপিআই তে ফাইল আপলোডের সময় আপনি ফাইলের টাইপ (MIME type) যাচাই করতে পারেন যাতে নিশ্চিত হতে পারেন যে শুধুমাত্র নির্দিষ্ট ধরনের ফাইল (যেমন ইমেজ) আপলোড করা হচ্ছে।
উদাহরণ: File Type Validation (Image)
from fastapi import FastAPI, File, UploadFile, HTTPException
from typing import List
app = FastAPI()
ALLOWED_EXTENSIONS = ["jpg", "jpeg", "png"]
def allowed_file(filename: str) -> bool:
return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS
@app.post("/uploadimage/")
async def upload_image(image: UploadFile = File(...)):
if not allowed_file(image.filename):
raise HTTPException(status_code=400, detail="Invalid file format. Only jpg, jpeg, and png are allowed.")
image_location = f"images/{image.filename}"
with open(image_location, "wb") as buffer:
shutil.copyfileobj(image.file, buffer)
return {"filename": image.filename}
এখানে:
allowed_file()ফাংশনটি ফাইলের এক্সটেনশন চেক করে।HTTPExceptionব্যবহার করে, আপনি যদি অবৈধ ফাইল টাইপ পান তবে ত্রুটি (error) প্রদান করতে পারেন।
রিকোয়েস্ট উদাহরণ:
POST /uploadimage/
ফাইল: example.gif (এটি অবৈধ হবে কারণ শুধুমাত্র jpg, jpeg, এবং png অনুমোদিত)
রেসপন্স:
{
"detail": "Invalid file format. Only jpg, jpeg, and png are allowed."
}
Step 5: File Upload with Metadata
FastAPI তে UploadFile ক্লাসের মাধ্যমে আপনি শুধু ফাইলটি আপলোড করবেন না, বরং ফাইলের মেটাডেটাও পেতে পারবেন, যেমন ফাইলের নাম এবং কনটেন্ট টাইপ।
উদাহরণ: File Upload with Metadata
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
app = FastAPI()
@app.post("/uploadfilewithmetadata/")
async def upload_file_with_metadata(file: UploadFile = File(...)):
content_type = file.content_type # Content type (e.g., image/jpeg)
filename = file.filename # Filename
file_location = f"uploads/{filename}"
with open(file_location, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
return {"filename": filename, "content_type": content_type}
এখানে, file.content_type ব্যবহার করে ফাইলের MIME type এবং file.filename ব্যবহার করে ফাইলের নাম পাওয়া যায়।
রেসপন্স:
{
"filename": "example.jpg",
"content_type": "image/jpeg"
}
Step 6: Set Max File Size
ফাস্টএপিআই তে আপনি আপলোড করা ফাইলের সাইজ সীমাবদ্ধ করতে পারেন। এটি সুরক্ষিত করার জন্য বিশেষভাবে দরকারি যাতে খুব বড় ফাইল সার্ভারে আপলোড না হয়।
উদাহরণ: Set Max File Size
from fastapi import FastAPI, File, UploadFile, HTTPException
import os
app = FastAPI()
MAX_FILE_SIZE = 5 * 1024 * 1024 # 5MB
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
if file.spool_max_size > MAX_FILE_SIZE:
raise HTTPException(status_code=400, detail="File size exceeds the maximum limit of 5MB.")
file_location = f"files/{file.filename}"
with open(file_location, "wb") as buffer:
shutil.copyfileobj(file.file, buffer)
return {"filename": file.filename}
এখানে, spool_max_size ব্যবহার করে ফাইলের সাইজ চেক করা হয়েছে এবং যদি এটি ৫MB এর বেশি হয় তবে একটি ত্রুটি (error) প্রদান করা হবে।
FastAPI তে File এবং Image Upload খুব সহজে এবং কার্যকরভাবে কনফিগার করা যায়। এখানে আমরা UploadFile এবং File ক্লাস ব্যবহার করে ফাইল এবং ইমেজ আপলোডের কাজ শিখেছি। এছাড়া, ফাইল টাইপ ভ্যালিডেশন, ফাইল মেটাডেটা এক্সট্র্যাকশন এবং সাইজ লিমিটও কনফিগার করতে শিখেছি। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ এবং কার্যকরী করতে পারেন।
Read more