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