File এবং Image Upload কনফিগার করা

Web Development - ফাস্টএপিআই (FastAPI) - FastAPI এর সঙ্গে File Upload এবং Handling
236

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 ক্লাস ব্যবহার করে ফাইল এবং ইমেজ আপলোডের কাজ শিখেছি। এছাড়া, ফাইল টাইপ ভ্যালিডেশন, ফাইল মেটাডেটা এক্সট্র্যাকশন এবং সাইজ লিমিটও কনফিগার করতে শিখেছি। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ এবং কার্যকরী করতে পারেন।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...