FastAPI-তে File Upload এবং Handling খুব সহজ এবং শক্তিশালী। FastAPI তে ফাইল আপলোডের জন্য File এবং UploadFile টিপ ব্যবহার করা হয়। UploadFile খুবই কার্যকর কারণ এটি বড় ফাইল আপলোডের ক্ষেত্রে কর্মক্ষমতা এবং মেমরি ব্যবস্থাপনাকে উন্নত করে।
এখানে, আমরা ফাস্টএপিআই-এ ফাইল আপলোড এবং হ্যান্ডলিং এর উদাহরণ দেখব।
Step 1: FastAPI তে ফাইল আপলোড করতে File এবং UploadFile ব্যবহার করা
ফাস্টএপিআই-তে ফাইল আপলোড করার জন্য দুটি প্রধান পদ্ধতি রয়েছে:
File: সাধারণভাবে ছোট ফাইল আপলোডের জন্য ব্যবহৃত হয়।UploadFile: বড় ফাইল আপলোড করার জন্য, যেখানে ফাইলের মেটাডেটা (ফাইলের নাম, কনটেন্ট টাইপ ইত্যাদি) অ্যাক্সেস করা যায় এবং ফাইলটি ডিস্কে সংরক্ষণ করা যায়।
উদাহরণ 1: File ব্যবহার করে ফাইল আপলোড
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
contents = await file.read() # ফাইলের কন্টেন্ট পড়া
with open(f"uploaded_{file.filename}", "wb") as f:
f.write(contents) # ফাইল সেভ করা
return {"filename": file.filename, "content_type": file.content_type}
এখানে, UploadFile ব্যবহার করা হয়েছে যাতে ফাইলের কনটেন্ট পড়ে এবং তা ডিফল্ট ফোল্ডারে সেভ করা যায়।
রিকোয়েস্ট উদাহরণ (HTML ফর্ম):
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
<input type="file" name="file">
<input type="submit">
</form>
Step 2: File এবং UploadFile এর মধ্যে পার্থক্য
- File: এটি ছোট ফাইল আপলোডের জন্য ব্যবহৃত হয়, যেখানে পুরো ফাইলটি মেমরিতে লোড করা হয়।
- UploadFile: এটি বড় ফাইল আপলোডের জন্য আদর্শ, যেখানে ফাইলটি মেমরির বদলে ডিস্কে স্টোর করা হয় এবং এর মেটাডেটা অ্যাক্সেস করা যায়।
UploadFile ব্যবহার করার উপকারিতা:
- স্মৃতি ব্যবস্থাপনা: UploadFile ফাইলটিকে ডিস্কে সঞ্চয় করে, তাই এটি মেমরির উপর চাপ ফেলে না।
- ফাইল মেটাডেটা: UploadFile ফাইলের নাম, কনটেন্ট টাইপ এবং সাইজের মতো মেটাডেটা প্রদান করে।
- আসিঙ্ক্রোনাস অপারেশন: ফাইল পড়া বা লেখার জন্য
async/awaitব্যবহার করা হয়, যা অ্যাসিঙ্ক্রোনাস অপারেশনগুলোতে কার্যক্ষমতা বৃদ্ধি করে।
Step 3: ফাইলের মেটাডেটা অ্যাক্সেস করা
UploadFile ব্যবহার করে আপনি ফাইলের মেটাডেটা যেমন ফাইলের নাম এবং কনটেন্ট টাইপ অ্যাক্সেস করতে পারেন।
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
return {"filename": file.filename, "content_type": file.content_type}
রেসপন্স:
{
"filename": "example.txt",
"content_type": "text/plain"
}
Step 4: Multiple File Upload
FastAPI তে একাধিক ফাইল একসাথে আপলোড করতে পারেন। একাধিক ফাইল আপলোড করার জন্য List[UploadFile] ব্যবহার করতে হয়।
উদাহরণ: একাধিক ফাইল আপলোড করা
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:
contents = await file.read()
with open(f"uploaded_{file.filename}", "wb") as f:
f.write(contents)
file_names.append(file.filename)
return {"uploaded_files": file_names}
এখানে, List[UploadFile] ব্যবহৃত হয়েছে যাতে একাধিক ফাইল পাঠানো যায়। প্রতিটি ফাইলকে সঠিকভাবে পড়ে এবং সেভ করা হবে।
রিকোয়েস্ট উদাহরণ (HTML ফর্ম):
<form action="/uploadfiles/" enctype="multipart/form-data" method="post">
<input type="file" name="files" multiple>
<input type="submit">
</form>
রেসপন্স:
{
"uploaded_files": ["file1.txt", "file2.jpg"]
}
Step 5: ফাইলের সাইজ যাচাই করা
FastAPI তে আপনি ফাইল আপলোড করার সময় ফাইলের সাইজ যাচাই করতে পারেন, যেন তা আপনার নির্ধারিত সীমার মধ্যে থাকে।
from fastapi import FastAPI, File, UploadFile, HTTPException
import os
app = FastAPI()
MAX_FILE_SIZE = 10 * 1024 * 1024 # 10MB
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
file_size = len(await file.read())
if file_size > MAX_FILE_SIZE:
raise HTTPException(status_code=400, detail="File is too large")
with open(f"uploaded_{file.filename}", "wb") as f:
f.write(await file.read())
return {"filename": file.filename, "file_size": file_size}
এখানে, MAX_FILE_SIZE ব্যবহার করে আমরা ফাইলের সাইজ চেক করেছি এবং যদি তা নির্ধারিত সীমার বেশি হয়, তবে 400 Bad Request ত্রুটি দেখানো হবে।
Step 6: File Types এর Validation
আপনি ফাইলের কনটেন্ট টাইপ যাচাই করতে পারেন, যেমন শুধুমাত্র .png বা .jpg ইমেজ ফাইলগুলো গ্রহণ করতে।
from fastapi import FastAPI, File, UploadFile, HTTPException
app = FastAPI()
ALLOWED_FILE_TYPES = ["image/jpeg", "image/png"]
@app.post("/uploadimage/")
async def upload_image(file: UploadFile = File(...)):
if file.content_type not in ALLOWED_FILE_TYPES:
raise HTTPException(status_code=400, detail="Invalid file type")
with open(f"uploaded_{file.filename}", "wb") as f:
f.write(await file.read())
return {"filename": file.filename, "content_type": file.content_type}
এখানে, আমরা ALLOWED_FILE_TYPES চেক করেছি, যা কেবল JPEG এবং PNG ইমেজ ফাইলগুলোকেই গ্রহণ করবে।
রিকোয়েস্ট উদাহরণ:
Content-Type: image/jpeg বা image/png
রেসপন্স:
{
"filename": "example.jpg",
"content_type": "image/jpeg"
}
Step 7: Download File
FastAPI তে আপনি ফাইল ডাউনলোড করার জন্য FileResponse ব্যবহার করতে পারেন, যা একটি ফাইলের কন্টেন্ট পাঠানোর জন্য ব্যবহৃত হয়।
from fastapi import FastAPI
from fastapi.responses import FileResponse
app = FastAPI()
@app.get("/download/{filename}")
async def download_file(filename: str):
file_path = f"uploaded_{filename}"
return FileResponse(file_path, media_type='application/octet-stream', filename=filename)
এখানে, FileResponse ব্যবহার করে ফাইলটি ক্লায়েন্টকে পাঠানো হচ্ছে।
রিকোয়েস্ট উদাহরণ:
GET /download/example.txt
রেসপন্স:
ফাইল ডাউনলোড শুরু হবে।
FastAPI তে File Upload এবং Handling খুবই সহজ এবং কার্যকর। ফাইল আপলোডের জন্য UploadFile এবং File ব্যবহার করে আপনি ছোট ও বড় ফাইল আপলোড করতে পারেন। এছাড়া, ফাইলের সাইজ যাচাই, ফাইল টাইপ যাচাই, একাধিক ফাইল আপলোড এবং ফাইল ডাউনলোড করা FastAPI তে খুবই সহজ। FastAPI আপনাকে দ্রুত এবং নিরাপদভাবে ফাইল হ্যান্ডলিংয়ের জন্য একটি শক্তিশালী প্ল্যাটফর্ম প্রদান করে।
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 ক্লাস ব্যবহার করে ফাইল এবং ইমেজ আপলোডের কাজ শিখেছি। এছাড়া, ফাইল টাইপ ভ্যালিডেশন, ফাইল মেটাডেটা এক্সট্র্যাকশন এবং সাইজ লিমিটও কনফিগার করতে শিখেছি। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ এবং কার্যকরী করতে পারেন।
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 করা খুবই সহজ এবং শক্তিশালী। আপনি একাধিক ফাইল একসাথে আপলোড করতে পারেন এবং সেগুলোর জন্য টাইপ, সাইজ, এক্সটেনশন এবং মেটাডেটা যাচাই করতে পারেন। এছাড়াও, ফাইল সিস্টেমে সংরক্ষণ এবং মুছে ফেলা সম্ভব, যা আপনাকে ফাইল হ্যান্ডলিংয়ের জন্য খুবই কার্যকরী সমাধান প্রদান করে।
FastAPI তে File Handling এবং Temporary Files Management খুবই সহজ। FastAPI আপনাকে ফাইল আপলোড এবং ডাউনলোড করার জন্য শক্তিশালী API প্রদান করে। এটি ফাইলের আকার, টাইপ যাচাই এবং ফাইল সঞ্চয়ের জন্য UploadFile এবং File ক্লাসের মাধ্যমে ফাইল হ্যান্ডলিং পরিচালনা করতে সক্ষম।
এখানে আমরা দেখব কিভাবে FastAPI তে ফাইল আপলোড, ফাইল সঞ্চয় এবং Temporary Files ম্যানেজমেন্ট করা যায়।
FastAPI তে ফাইল আপলোড করা
FastAPI তে ফাইল আপলোড করার জন্য UploadFile ক্লাস ব্যবহার করা হয়, যা File ক্লাসের সাথে মিলে কাজ করে। এটি ফাইলের মেটাডেটা যেমন ফাইলের নাম, কনটেন্ট টাইপ ইত্যাদি সহজেই অ্যাক্সেস করতে সাহায্য করে।
ফাইল আপলোডের উদাহরণ:
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import HTMLResponse
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
return {"filename": file.filename, "content_type": file.content_type}
এখানে:
UploadFile: ফাইল আপলোডের জন্য ব্যবহৃত ক্লাস।File(...): ফাইল ইনপুট হিসেবে প্যারামিটার।
ফাইল আপলোডের HTML ফর্ম:
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
<input type="file" name="file">
<input type="submit">
</form>
এখানে, ফর্মের মাধ্যমে ফাইলটি আপলোড করা হয়।
রেসপন্স:
{
"filename": "example.txt",
"content_type": "text/plain"
}
এখানে ফাইলের নাম এবং কনটেন্ট টাইপ রেসপন্সে ফিরিয়ে দেওয়া হয়েছে।
Temporary Files (অস্থায়ী ফাইল)
FastAPI তে Temporary Files ম্যানেজ করতে tempfile লাইব্রেরি ব্যবহার করা হয়। এটি সাধারণত আপলোড করা ফাইল সংরক্ষণ করার জন্য ব্যবহৃত হয় এবং বিশেষত ডেটা প্রক্রিয়াকরণের পরে ফাইল ডিলিট করতে সহায়ক।
উদাহরণ: আপলোড করা ফাইলের জন্য অস্থায়ী ফাইল তৈরি করা
import tempfile
from fastapi import FastAPI, UploadFile, File
app = FastAPI()
@app.post("/uploadfile/")
async def create_temp_file(file: UploadFile = File(...)):
# অস্থায়ী ফাইল তৈরি করা
with tempfile.NamedTemporaryFile(delete=False) as temp_file:
content = await file.read() # ফাইলের কনটেন্ট পড়া
temp_file.write(content) # কনটেন্ট অস্থায়ী ফাইলে লেখা
temp_file_path = temp_file.name # অস্থায়ী ফাইলের পাথ
return {"temp_file_path": temp_file_path}
এখানে:
tempfile.NamedTemporaryFile: একটি অস্থায়ী ফাইল তৈরি করতে ব্যবহৃত হয়।delete=False: এটি অস্থায়ী ফাইলটি ডিলিট না করতে সহায়ক, তাই আপনি এটি পরে ব্যবহার করতে পারেন।
রেসপন্স:
{
"temp_file_path": "/tmp/tmpabcdef12"
}
এখানে, ফাইলটির অস্থায়ী পাথ ফেরত দেওয়া হয়েছে।
File Upload Handling with Streaming
FastAPI তে ফাইল আপলোডের জন্য streaming এর মাধ্যমে ডাটা পাঠানো যেতে পারে। এই প্রক্রিয়া বড় ফাইলগুলো আপলোড করতে সহায়ক।
from fastapi import FastAPI, File, UploadFile
from io import BytesIO
app = FastAPI()
@app.post("/upload_large_file/")
async def upload_large_file(file: UploadFile = File(...)):
content = await file.read() # পুরো ফাইলটি স্ট্রীমের মাধ্যমে পড়া
# প্রয়োজনীয় ডাটা প্রসেস করা (যেমন সেভ করা, বা অন্য কিছু)
return {"filename": file.filename, "file_size": len(content)}
এখানে, ফাইলটি streaming করে পড়া হয়েছে, যা বড় ফাইল আপলোডের সময় কার্যকর।
File Downloading
FastAPI তে ফাইল ডাউনলোডের জন্য FileResponse ব্যবহার করা হয়। এটি সার্ভার থেকে ক্লায়েন্টে ফাইল পাঠানোর জন্য ব্যবহৃত হয়।
উদাহরণ: File Download
from fastapi import FastAPI
from fastapi.responses import FileResponse
import os
app = FastAPI()
@app.get("/downloadfile/")
async def download_file():
file_path = "/path/to/your/file.txt"
return FileResponse(file_path, media_type="application/octet-stream", filename="file.txt")
এখানে FileResponse ক্লাস ফাইলটি পাঠানোর জন্য ব্যবহৃত হয়।
রেসপন্স:
এটি ক্লায়েন্টের ব্রাউজারে ফাইলটি ডাউনলোড করতে সহায়ক হবে।
File Size Validation
FastAPI তে ফাইলের আকার যাচাই করার জন্য আপনি File এবং UploadFile প্যারামিটার ব্যবহার করতে পারেন এবং যদি ফাইলের আকার খুব বড় হয়, তবে ত্রুটি প্রদান করতে পারেন।
উদাহরণ: File Size Validation
from fastapi import FastAPI, File, UploadFile, HTTPException
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
max_file_size = 5 * 1024 * 1024 # 5MB
if len(await file.read()) > max_file_size:
raise HTTPException(status_code=400, detail="File size exceeds the limit of 5MB")
return {"filename": file.filename}
এখানে, ফাইলের আকার যাচাই করা হয়েছে এবং যদি তা ৫MB এর বেশি হয়, তবে ত্রুটি রেসপন্স প্রদান করা হয়।
File Handling in Background Tasks
আপনি ফাইল আপলোডের পরে ফাইল প্রক্রিয়াকরণের জন্য background tasks ব্যবহার করতে পারেন। FastAPI তে BackgroundTasks ক্লাস এই কাজের জন্য ব্যবহৃত হয়।
উদাহরণ: File Handling with Background Task
from fastapi import FastAPI, UploadFile, File, BackgroundTasks
import time
app = FastAPI()
def process_file(file_name: str):
# ফাইল প্রক্রিয়াকরণ সিমুলেশন
time.sleep(5)
print(f"File {file_name} processed!")
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...), background_tasks: BackgroundTasks):
background_tasks.add_task(process_file, file.filename)
return {"message": "File is being processed in the background"}
এখানে, BackgroundTasks ব্যবহার করা হয়েছে যাতে ফাইল আপলোডের পরে ফাইল প্রক্রিয়াকরণ ব্যাকগ্রাউন্ডে চলে।
FastAPI তে File Handling এবং Temporary Files Management সহজে করা যায়। আপনি ফাইল আপলোড করতে UploadFile, ফাইল ডাউনলোড করতে FileResponse, এবং অস্থায়ী ফাইল ব্যবস্থাপনার জন্য tempfile ব্যবহার করতে পারেন। এছাড়া background tasks এর মাধ্যমে আপনি ফাইল প্রক্রিয়াকরণ ব্যাকগ্রাউন্ডে পরিচালনা করতে পারবেন। FastAPI ফাইল হ্যান্ডলিংয়ের জন্য একটি শক্তিশালী এবং স্কেলেবল সমাধান প্রদান করে।
ফাইল আপলোড করা অনেক ধরনের অ্যাপ্লিকেশনে একটি সাধারণ কাজ হলেও, এটি যদি সঠিকভাবে নিরাপত্তা নিশ্চিত না করা হয়, তাহলে অ্যাপ্লিকেশনের সুরক্ষায় বড় সমস্যা তৈরি করতে পারে। FastAPI তে ফাইল আপলোড করার সময় নিরাপত্তা সমস্যা সমাধান করতে কিছু গুরুত্বপূর্ণ পদ্ধতি ও কৌশল আছে।
এই গাইডে, আমরা আলোচনা করব ফাইল আপলোডের সময় কিছু গুরুত্বপূর্ণ নিরাপত্তা চিন্তা এবং সেগুলোর সমাধান কীভাবে করা যায় তা।
১. ফাইল সাইজ সীমাবদ্ধ করা
একটি সাধারণ নিরাপত্তা প্র্যাকটিস হল ফাইল সাইজ সীমাবদ্ধ করা। বড় ফাইল আপলোড করলে সার্ভারটি অতিরিক্ত লোড হতে পারে, বা অ্যাটাকারের জন্য সার্ভারে স্টোরেজ খালি করার সুযোগ তৈরি হতে পারে। তাই ফাইলের সাইজ সীমাবদ্ধ করা উচিত।
FastAPI তে ফাইল সাইজ সীমাবদ্ধ করার উদাহরণ:
from fastapi import FastAPI, File, UploadFile
from starlette.requests import Request
app = FastAPI()
MAX_FILE_SIZE = 5 * 1024 * 1024 # 5MB
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
# ফাইলের সাইজ চেক করা
file_size = len(await file.read())
if file_size > MAX_FILE_SIZE:
return {"error": "File size exceeds limit"}
return {"filename": file.filename, "size": file_size}
এখানে, ফাইলের সাইজ 5MB এর বেশি হলে রিকোয়েস্ট গ্রহণ করা হবে না।
২. ফাইল টাইপ যাচাই করা
ফাইল আপলোডের সময় নিরাপত্তার জন্য এটি গুরুত্বপূর্ণ যে ফাইলের টাইপ যাচাই করা হয়। এটি নিশ্চিত করতে পারে যে অ্যাটাকারের আপলোড করা ম্যালিসিয়াস ফাইল (যেমন, স্ক্রিপ্ট, অ্যাপ্লিকেশন, বা ক্ষতিকারক এক্সটেনশনের ফাইল) গ্রহণ না করা হয়।
উদাহরণ: ফাইল টাইপ যাচাই
from fastapi import FastAPI, File, UploadFile
import mimetypes
app = FastAPI()
ALLOWED_FILE_TYPES = ["image/jpeg", "image/png", "application/pdf"]
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
# MIME টাইপ যাচাই
mime_type, _ = mimetypes.guess_type(file.filename)
if mime_type not in ALLOWED_FILE_TYPES:
return {"error": "Invalid file type"}
return {"filename": file.filename, "type": mime_type}
এখানে, MIME টাইপ যাচাই করা হয়েছে যাতে শুধুমাত্র নির্দিষ্ট ধরনের ফাইল যেমন JPEG, PNG, এবং PDF গ্রহণ করা হয়।
৩. ফাইলের নাম যাচাই করা
ফাইলের নাম নিরাপত্তা হুমকি সৃষ্টি করতে পারে, কারণ আক্রমণকারী কোনো ম্যালিসিয়াস ফাইলের নাম ব্যবহার করে সার্ভারে প্রবেশ করতে পারে। সুতরাং, ফাইলের নাম যাচাই করা খুবই গুরুত্বপূর্ণ।
উদাহরণ: ফাইল নাম যাচাই
import re
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
# ফাইল নামের বৈধতা যাচাই
if not re.match(r"^[a-zA-Z0-9_\-\.]+$", file.filename):
return {"error": "Invalid file name"}
return {"filename": file.filename}
এখানে, শুধুমাত্র আলফানিউমেরিক, ড্যাশ (-), আন্ডারস্কোর (_) এবং পিরিয়ড (.) চরিত্রসমূহ বৈধ হিসেবে গ্রহণ করা হচ্ছে। এর মাধ্যমে অবাঞ্ছিত বা ক্ষতিকর ফাইল নামগুলো ব্লক করা হবে।
৪. ফাইল আপলোডের স্থান সুরক্ষা
ফাইল আপলোড করার সময়, সেগুলি অবশ্যই নিরাপদ স্থানে সংরক্ষণ করতে হবে। যদি আপনি ফাইলগুলো সরাসরি ওয়েব সার্ভারের ডিরেক্টরিতে সংরক্ষণ করেন, তাহলে সেখানে সহজেই এক্সেস হতে পারে। ফাইলগুলো নিরাপদ ডিরেক্টরি বা ক্লাউড স্টোরেজে সংরক্ষণ করা উচিত।
উদাহরণ: ফাইল সুরক্ষিত ডিরেক্টরিতে সংরক্ষণ
import os
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
UPLOAD_DIR = "./uploads"
# যদি ডিরেক্টরি না থাকে, তা তৈরি করা
if not os.path.exists(UPLOAD_DIR):
os.makedirs(UPLOAD_DIR)
@app.post("/uploadfile/")
async def upload_file(file: UploadFile = File(...)):
file_path = os.path.join(UPLOAD_DIR, file.filename)
with open(file_path, "wb") as f:
f.write(await file.read())
return {"filename": file.filename, "path": file_path}
এখানে, ফাইল uploads/ নামক নিরাপদ ডিরেক্টরিতে সংরক্ষণ করা হচ্ছে, এবং কোনো ব্যবহারকারী সরাসরি ফাইলগুলোর উপর অ্যাক্সেস পাবে না।
৫. ফাইল কনটেন্ট স্ক্যানিং (Antivirus Check)
ফাইল আপলোডের সময়, ফাইলের কনটেন্ট ম্যালিসিয়াস বা ভাইরাস মুক্ত কিনা তা নিশ্চিত করার জন্য আপনাকে Antivirus স্ক্যানিং করা উচিত। যদিও FastAPI তে সরাসরি এই ধরনের স্ক্যানিং নেই, তবে আপনি থার্ড-পার্টি লাইব্রেরি যেমন ClamAV বা অন্য কোনো নিরাপত্তা সফটওয়্যার ব্যবহার করে স্ক্যান করতে পারেন।
৬. এলগোরিদম এবং আক্রমণ প্রতিরোধ
- DDoS আক্রমণ প্রতিরোধ: বড় আকারের বা বেশ কয়েকটি ফাইল একসাথে আপলোড করা হলে এটি DDoS (Distributed Denial of Service) আক্রমণের কারণ হতে পারে। আপনি একাধিক ফাইল আপলোড সীমিত করতে পারেন।
- Rate Limiting: একবারে কতটা ডাটা আপলোড করা যেতে পারে, সে বিষয়ে Rate Limiting সেট করা যায়। এর মাধ্যমে একে একে ফাইল আপলোড করার গতির উপর নিয়ন্ত্রণ রাখা যায়।
৭. ফাইল কনটেন্ট সাইজ এবং প্রকার সুরক্ষা
- ফাইল সাইজ সীমাবদ্ধ করা: ফাইলের সাইজ সীমাবদ্ধ রাখার মাধ্যমে অ্যাটাকারের আপলোড করা অত্যন্ত বড় ফাইলগুলিকে ব্লক করা যেতে পারে।
- ফাইল টাইপ যাচাই: শুধুমাত্র নির্দিষ্ট ধরনের ফাইল অনুমোদন করা উচিত, যেমন images, PDFs ইত্যাদি। MIME টাইপ চেকিং এবং File Extension চেকিং নিশ্চিত করতে হবে।
ফাইল আপলোড নিরাপত্তার জন্য অনেক গুরুত্বপূর্ণ সমস্যা নিয়ে আসে, এবং FastAPI তে ফাইল আপলোডের সময় আপনি বিভিন্ন নিরাপত্তা ব্যবস্থা গ্রহণ করতে পারেন। সেগুলির মধ্যে ফাইল সাইজ সীমাবদ্ধ করা, ফাইল টাইপ যাচাই, সেশন এবং সুরক্ষিত ডিরেক্টরিতে ফাইল সংরক্ষণ করা, এবং অ্যান্টিভাইরাস স্ক্যানিং অন্তর্ভুক্ত। এই ধরনের নিরাপত্তা ব্যবস্থা ব্যবহার করলে, অ্যাপ্লিকেশনটি ম্যালিসিয়াস ফাইল এবং অন্যান্য ঝুঁকি থেকে সুরক্ষিত থাকবে।
Read more