Multiple File Upload এবং File Validation

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

FastAPI তে Multiple File Upload এবং File Validation করা খুবই সহজ এবং শক্তিশালী। FastAPI File এবং UploadFile এর মাধ্যমে এক বা একাধিক ফাইল গ্রহণ করতে পারে, এবং ফাইলের বৈশিষ্ট্য যাচাই করতে Pydantic এবং অন্যান্য ফিচার ব্যবহার করা যায়। এখানে আমরা দেখব কিভাবে Multiple File Upload এবং File Validation FastAPI তে বাস্তবায়ন করা যায়।


Step 1: Multiple File Upload

FastAPI তে একাধিক ফাইল আপলোড করার জন্য File এবং UploadFile ক্লাস ব্যবহার করা হয়। এই ক্লাস দুটি খুবই কার্যকরী এবং আপনাকে সহজেই একাধিক ফাইল হ্যান্ডল করতে সহায়তা করে।

উদাহরণ: Multiple File Upload

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

app = FastAPI()

@app.post("/uploadfiles/")
async def upload_files(files: List[UploadFile] = File(...)):
    file_names = []
    for file in files:
        file_names.append(file.filename)
    return {"file_names": file_names}

এখানে:

  • files: List[UploadFile] = File(...): এটি একাধিক ফাইল গ্রহণ করে, যেগুলি একটি List আকারে জমা হবে।
  • UploadFile ক্লাসটি ফাইলের তথ্য ধারণ করে, যেমন filename, content_type, ইত্যাদি।

রিকোয়েস্ট উদাহরণ (Multiple File Upload):

<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
    <input type="file" name="files" multiple>
    <input type="submit">
</form>

এখানে, multiple অ্যাট্রিবিউটটি ব্যবহার করে একাধিক ফাইল নির্বাচন করা যাবে।

রেসপন্স:

{
  "file_names": ["file1.txt", "file2.png"]
}

Step 2: File Validation

ফাইল আপলোডের সময় কিছু সাধারণ ভ্যালিডেশন যেমন ফাইলের সাইজ, টাইপ, এক্সটেনশন ইত্যাদি যাচাই করা খুবই গুরুত্বপূর্ণ। FastAPI তে UploadFile ক্লাসটি ব্যবহার করে সহজেই এই ভ্যালিডেশন করা যায়।

উদাহরণ: File Size এবং File Type Validation

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

app = FastAPI()

# File Size এবং Type Validation
ALLOWED_EXTENSIONS = ["jpg", "jpeg", "png"]
MAX_FILE_SIZE = 5 * 1024 * 1024  # 5 MB

@app.post("/uploadfiles/")
async def upload_files(files: List[UploadFile] = File(...)):
    file_names = []
    for file in files:
        # File extension check
        extension = file.filename.split(".")[-1].lower()
        if extension not in ALLOWED_EXTENSIONS:
            raise HTTPException(status_code=400, detail=f"File type {extension} not allowed")
        
        # File size check
        file_content = await file.read()
        if len(file_content) > MAX_FILE_SIZE:
            raise HTTPException(status_code=400, detail="File size exceeds the maximum limit of 5 MB")

        file_names.append(file.filename)
    return {"file_names": file_names}

এখানে:

  • File Extension Check: ফাইলের এক্সটেনশন .jpg, .jpeg, .png সহ্যযোগ্য হিসেবে চিহ্নিত করা হয়েছে। অন্য কোন ফাইল টাইপ পাঠালে ত্রুটি দেখানো হবে।
  • File Size Check: ফাইলের আকার ৫ মেগাবাইটের বেশি হলে ত্রুটি দেখানো হবে।

রিকোয়েস্ট উদাহরণ (Multiple File Upload):

<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
    <input type="file" name="files" multiple>
    <input type="submit">
</form>

রেসপন্স (যদি ফাইল টাইপ বা সাইজ ঠিক না থাকে):

{
  "detail": "File type png not allowed"
}

Step 3: File Metadata (Additional Validation)

ফাইলের metadata (যেমন ফাইলের নাম, টাইপ, সাইজ) যাচাইও করা যেতে পারে। FastAPI এর UploadFile ক্লাস এর মাধ্যমে ফাইলের মেটাডেটা যেমন content_type, filename ইত্যাদি সহজেই অ্যাক্সেস করা যায়।

উদাহরণ: File Metadata Validation

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

app = FastAPI()

# File Type and Metadata Validation
ALLOWED_EXTENSIONS = ["jpg", "jpeg", "png"]

@app.post("/uploadfiles/")
async def upload_files(files: List[UploadFile] = File(...)):
    file_names = []
    for file in files:
        # File extension check
        extension = file.filename.split(".")[-1].lower()
        if extension not in ALLOWED_EXTENSIONS:
            raise HTTPException(status_code=400, detail=f"File type {extension} not allowed")

        # File metadata check
        if file.content_type not in ["image/jpeg", "image/png"]:
            raise HTTPException(status_code=400, detail="Invalid file type")

        file_names.append(file.filename)
    return {"file_names": file_names}

এখানে:

  • File Content Type Validation: ফাইলের কনটেন্ট টাইপ (যেমন image/jpeg, image/png) যাচাই করা হচ্ছে।
  • File Extension Validation: ফাইল এক্সটেনশন (যেমন .jpg, .png) যাচাই করা হচ্ছে।

রিকোয়েস্ট উদাহরণ:

<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
    <input type="file" name="files" multiple>
    <input type="submit">
</form>

রেসপন্স (যদি কনটেন্ট টাইপ ঠিক না থাকে):

{
  "detail": "Invalid file type"
}

Step 4: Saving the Uploaded Files

FastAPI তে Uploaded Files অ্যাপ্লিকেশনের মধ্যে সংরক্ষণ (save) করতে পারেন। UploadFile এর file অ্যাট্রিবিউট ব্যবহার করে ফাইলটি সিস্টেমে সংরক্ষণ করা যায়।

উদাহরণ: Saving Files Locally

from fastapi import FastAPI, File, UploadFile
import os

app = FastAPI()

UPLOAD_DIRECTORY = "./uploaded_files"

# Create upload directory if it doesn't exist
if not os.path.exists(UPLOAD_DIRECTORY):
    os.makedirs(UPLOAD_DIRECTORY)

@app.post("/uploadfiles/")
async def upload_files(files: List[UploadFile] = File(...)):
    file_paths = []
    for file in files:
        file_path = os.path.join(UPLOAD_DIRECTORY, file.filename)
        with open(file_path, "wb") as f:
            f.write(await file.read())
        file_paths.append(file_path)
    
    return {"file_paths": file_paths}

এখানে, ফাইলটি uploaded_files/ ডিরেক্টরিতে সংরক্ষণ করা হচ্ছে এবং ফাইলের পথ (path) রেসপন্স হিসেবে পাঠানো হচ্ছে।

রিকোয়েস্ট উদাহরণ (Multiple File Upload):

<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
    <input type="file" name="files" multiple>
    <input type="submit">
</form>

রেসপন্স:

{
  "file_paths": ["./uploaded_files/file1.jpg", "./uploaded_files/file2.png"]
}

Step 5: Clean-up and File Deletion

ফাইল আপলোডের পর আপনি চাইলে অতিরিক্ত প্রক্রিয়াকরণের জন্য ফাইলগুলি মুছে ফেলতে পারেন। FastAPI তে আপনি os.remove() ব্যবহার করে ফাইল ডিলিট করতে পারেন।

import os

@app.post("/deletefile/")
async def delete_file(file_name: str):
    file_path = os.path.join(UPLOAD_DIRECTORY, file_name)
    if os.path.exists(file_path):
        os.remove(file_path)
        return {"message": f"File {file_name} deleted successfully"}
    else:
        raise HTTPException(status_code=404, detail="File not found")

রিকোয়েস্ট উদাহরণ (File Deletion):

{
  "file_name": "file1.jpg"
}

রেসপন্স:

{
  "message": "File file1.jpg deleted successfully"
}

FastAPI তে Multiple File Upload এবং File Validation করা খুবই সহজ এবং শক্তিশালী। আপনি একাধিক ফাইল একসাথে আপলোড করতে পারেন এবং সেগুলোর জন্য টাইপ, সাইজ, এক্সটেনশন এবং মেটাডেটা যাচাই করতে পারেন। এছাড়াও, ফাইল সিস্টেমে সংরক্ষণ এবং মুছে ফেলা সম্ভব, যা আপনাকে ফাইল হ্যান্ডলিংয়ের জন্য খুবই কার্যকরী সমাধান প্রদান করে।

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

Are you sure to start over?

Loading...