দক্ষ মাল্টিপার্ট ফর্ম ফাইল আপলোডের জন্য ফাস্টএপিআই-এর শক্তি উন্মোচন করুন। এই ব্যাপক নির্দেশিকাটিতে বিশ্বব্যাপী বিকাশকারীদের জন্য সেরা অনুশীলন, ত্রুটি হ্যান্ডলিং এবং উন্নত কৌশল অন্তর্ভুক্ত করা হয়েছে।
ফাস্টএপিআই ফাইল আপলোডগুলি আয়ত্ত করা: মাল্টিপার্ট ফর্ম প্রক্রিয়াকরণের গভীরে ডুব
আধুনিক ওয়েব অ্যাপ্লিকেশনগুলিতে, ফাইল আপলোডগুলি পরিচালনা করার ক্ষমতা একটি মৌলিক প্রয়োজনীয়তা। ব্যবহারকারীরা প্রোফাইল ছবি, প্রক্রিয়াকরণের জন্য নথি জমা দিক বা মিডিয়া শেয়ার করার ক্ষেত্রেই হোক না কেন, শক্তিশালী এবং দক্ষ ফাইল আপলোড প্রক্রিয়াগুলি অত্যন্ত গুরুত্বপূর্ণ। ফাস্টএপিআই, একটি উচ্চ-পারফরম্যান্স পাইথন ওয়েব ফ্রেমওয়ার্ক, এই ডোমেইনে শ্রেষ্ঠত্ব অর্জন করে, মাল্টিপার্ট ফর্ম ডেটা পরিচালনা করার জন্য সুবিন্যস্ত উপায় সরবরাহ করে, যা HTTP-এর মাধ্যমে ফাইল পাঠানোর জন্য একটি মান। এই বিস্তৃত নির্দেশিকা আপনাকে মৌলিক প্রয়োগ থেকে উন্নত বিবেচনা পর্যন্ত ফাস্টএপিআই ফাইল আপলোডগুলির জটিলতার মধ্য দিয়ে নিয়ে যাবে, যা নিশ্চিত করবে যে আপনি আত্মবিশ্বাসের সাথে বিশ্বব্যাপী দর্শকদের জন্য শক্তিশালী এবং মাপযোগ্য এপিআই তৈরি করতে পারেন।
মাল্টিপার্ট ফর্ম ডেটা বোঝা
ফাস্টএপিআই-এর বাস্তবায়নে ডুব দেওয়ার আগে, মাল্টিপার্ট ফর্ম ডেটা কী তা বোঝা অপরিহার্য। যখন একটি ওয়েব ব্রাউজার ফাইল ধারণকারী একটি ফর্ম জমা দেয়, তখন এটি সাধারণত enctype="multipart/form-data" বৈশিষ্ট্য ব্যবহার করে। এই এনকোডিং টাইপ ফর্ম জমা দেওয়াকে একাধিক অংশে বিভক্ত করে, প্রতিটির নিজস্ব বিষয়বস্তু প্রকার এবং বিন্যাস তথ্য থাকে। এটি টেক্সট ক্ষেত্র, নন-টেক্সট ক্ষেত্র এবং বাইনারি ফাইল সহ একক HTTP অনুরোধের মধ্যে বিভিন্ন ধরণের ডেটা প্রেরণের অনুমতি দেয়।
একটি মাল্টিপার্ট অনুরোধের প্রতিটি অংশ গঠিত:
- বিষয়বস্তু-বিন্যাস শিরোনাম: ফর্ম ক্ষেত্রের নাম (
name) এবং ফাইলের জন্য, মূল ফাইলের নাম (filename) উল্লেখ করে। - বিষয়বস্তু-প্রকার শিরোনাম: অংশের MIME প্রকার নির্দেশ করে (যেমন,
text/plain,image/jpeg)। - বডি: সেই অংশের জন্য আসল ডেটা।
ফাইল আপলোডগুলির জন্য ফাস্টএপিআই-এর পদ্ধতি
ফাস্টএপিআই ডেটা বৈধতার জন্য পাইথনের স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করে এবং পাইড্যান্টিকের সাথে নির্বিঘ্নে সংহত হয়। ফাইল আপলোডের জন্য, এটি fastapi মডিউল থেকে UploadFile টাইপ ব্যবহার করে। এই ক্লাসটি আপলোড করা ফাইল ডেটা অ্যাক্সেস করার জন্য একটি সুবিধাজনক এবং নিরাপদ ইন্টারফেস প্রদান করে।
বেসিক ফাইল আপলোড বাস্তবায়ন
আসুন ফাস্টএপিআই-এ একটি একক ফাইল আপলোড গ্রহণ করে এমন একটি এন্ডপয়েন্ট তৈরি করার একটি সাধারণ উদাহরণ দিয়ে শুরু করা যাক। আমরা ফাইল প্যারামিটার ঘোষণা করতে fastapi থেকে File ফাংশন ব্যবহার করব।
from fastapi import FastAPI, File, UploadFile
app = FastAPI()
@app.post("/files/")
async def create_file(file: UploadFile):
return {"filename": file.filename, "content_type": file.content_type}
এই উদাহরণে:
- আমরা
FastAPI,File, এবংUploadFileআমদানি করি। - এন্ডপয়েন্ট
/files/একটিPOSTঅনুরোধ হিসাবে সংজ্ঞায়িত করা হয়েছে। fileপ্যারামিটারটিUploadFileদিয়ে চিহ্নিত করা হয়েছে, যা নির্দেশ করে যে এটি একটি ফাইল আপলোড আশা করে।- এন্ডপয়েন্ট ফাংশনের ভিতরে, আমরা আপলোড করা ফাইলের বৈশিষ্ট্যগুলি যেমন
filenameএবংcontent_typeঅ্যাক্সেস করতে পারি।
যখন একটি ক্লায়েন্ট একটি ফাইল সংযুক্ত করে /files/-এ একটি POST অনুরোধ পাঠায় (সাধারণত enctype="multipart/form-data" সহ একটি ফর্মের মাধ্যমে), ফাস্টএপিআই স্বয়ংক্রিয়ভাবে পার্সিং পরিচালনা করবে এবং একটি UploadFile অবজেক্ট সরবরাহ করবে। এর পরে আপনি এই বস্তুর সাথে ইন্টারঅ্যাক্ট করতে পারেন।
আপলোড করা ফাইলগুলি সংরক্ষণ করা
প্রায়শই, আপনাকে আপলোড করা ফাইলটি ডিস্কে সংরক্ষণ করতে হবে বা এর বিষয়বস্তু প্রক্রিয়া করতে হবে। UploadFile অবজেক্ট এর জন্য পদ্ধতি সরবরাহ করে:
read(): একটি ফাইল সম্পূর্ণরূপে মেমরিতে বাইট হিসাবে পড়ে। ছোট ফাইলের জন্য এটি ব্যবহার করুন।write(content: bytes): ফাইলে বাইট লিখে।seek(offset: int): বর্তমান ফাইলের অবস্থান পরিবর্তন করে।close(): ফাইল বন্ধ করে।
অ্যাসিনক্রোনাসভাবে ফাইলগুলি পরিচালনা করা গুরুত্বপূর্ণ, বিশেষ করে যখন বড় ফাইল বা I/O-সীমাবদ্ধ কাজগুলি মোকাবেলা করা হয়। ফাস্টএপিআই-এর UploadFile অ্যাসিনক্রোনাস অপারেশন সমর্থন করে।
from fastapi import FastAPI, File, UploadFile
import shutil
app = FastAPI()
@app.post("/files/save/")
async def save_file(file: UploadFile = File(...)):
file_location = f"./uploads/{file.filename}"
with open(file_location, "wb+") as file_object:
file_object.write(await file.read())
return {"info": f"file '{file.filename}' saved at '{file_location}'"}
এই উন্নত উদাহরণে:
- আমরা
File(...)ব্যবহার করি এটি নির্দেশ করতে যে এই প্যারামিটারটি প্রয়োজন। - আমরা একটি স্থানীয় পাথ নির্দিষ্ট করি যেখানে ফাইলটি সংরক্ষণ করা হবে। নিশ্চিত করুন
uploadsডিরেক্টরি বিদ্যমান। - আমরা বাইনারি রাইট মোডে (`"wb+"`) গন্তব্য ফাইলটি খুলি।
- আমরা
await file.read()ব্যবহার করে আপলোড করা ফাইলের বিষয়বস্তু অ্যাসিনক্রোনাসভাবে পড়ি এবং তারপরে এটিকে স্থানীয় ফাইলে লিখি।
দ্রষ্টব্য: await file.read() এর সাথে সম্পূর্ণ ফাইল মেমরিতে পড়া খুব বড় ফাইলের জন্য সমস্যাযুক্ত হতে পারে। এই ধরনের পরিস্থিতিতে, ফাইলের বিষয়বস্তু স্ট্রিমিং বিবেচনা করুন।
ফাইলের বিষয়বস্তু স্ট্রিমিং
বড় ফাইলের জন্য, সম্পূর্ণ বিষয়বস্তু মেমরিতে পড়া অতিরিক্ত মেমরি খরচ এবং সম্ভাব্য আউট-অফ-মেমরি ত্রুটির কারণ হতে পারে। একটি আরও মেমরি-দক্ষ পদ্ধতি হল ফাইলটিকে খণ্ড খণ্ড করে স্ট্রীম করা। shutil.copyfileobj ফাংশন এর জন্য চমৎকার, কিন্তু আমাদের এটিকে অ্যাসিনক্রোনাস অপারেশনের জন্য মানিয়ে নিতে হবে।
from fastapi import FastAPI, File, UploadFile
import aiofiles # Install using: pip install aiofiles
app = FastAPI()
@app.post("/files/stream/")
async def stream_file(file: UploadFile = File(...)):
file_location = f"./uploads/{file.filename}"
async with aiofiles.open(file_location, "wb") as out_file:
content = await file.read()
await out_file.write(content)
return {"info": f"file '{file.filename}' streamed and saved at '{file_location}'"}
aiofiles ব্যবহার করে, আমরা একবারেই পুরো ফাইলটি মেমরিতে লোড না করে আপলোড করা ফাইলের বিষয়বস্তু একটি গন্তব্য ফাইলে দক্ষতার সাথে স্ট্রিম করতে পারি। এই প্রসঙ্গে await file.read() এখনও পুরো ফাইলটি পড়ে, কিন্তু aiofiles আরও দক্ষতার সাথে লেখা পরিচালনা করে। UploadFile এর সাথে সত্য খণ্ড-দ্বারা-খণ্ড স্ট্রিমিংয়ের জন্য, আপনি সাধারণত await file.read(chunk_size) পুনরাবৃত্তি করবেন, তবে aiofiles.open এবং await out_file.write(content) সংরক্ষণ করার জন্য একটি সাধারণ এবং কার্যকরী প্যাটার্ন।
খণ্ড ব্যবহার করে আরও সুস্পষ্ট স্ট্রিমিং পদ্ধতি:
from fastapi import FastAPI, File, UploadFile
import aiofiles
app = FastAPI()
CHUNK_SIZE = 1024 * 1024 # 1MB chunk size
@app.post("/files/chunked_stream/")
async def chunked_stream_file(file: UploadFile = File(...)):
file_location = f"./uploads/{file.filename}"
async with aiofiles.open(file_location, "wb") as out_file:
while content := await file.read(CHUNK_SIZE):
await out_file.write(content)
return {"info": f"file '{file.filename}' chunked streamed and saved at '{file_location}'"}
এই `chunked_stream_file` এন্ডপয়েন্ট ১এমবি আকারের খণ্ডে ফাইলটি পড়ে এবং প্রতিটি খণ্ড আউটপুট ফাইলে লিখে। এটি সম্ভাব্য খুব বড় ফাইলগুলি পরিচালনা করার সবচেয়ে মেমরি-দক্ষ উপায়।
একাধিক ফাইল আপলোড পরিচালনা করা
ওয়েব অ্যাপ্লিকেশনগুলির জন্য প্রায়শই ব্যবহারকারীদের এক সাথে একাধিক ফাইল আপলোড করতে হয়। ফাস্টএপিআই এটি সহজ করে তোলে।
ফাইলের একটি তালিকা আপলোড করা
আপনি আপনার প্যারামিটারটিকে UploadFile-এর একটি তালিকা দিয়ে চিহ্নিত করে ফাইলের একটি তালিকা গ্রহণ করতে পারেন।
from fastapi import FastAPI, File, UploadFile, Form
from typing import List
app = FastAPI()
@app.post("/files/multiple/")
async def create_multiple_files(
files: List[UploadFile] = File(...)
):
results = []
for file in files:
# Process each file, e.g., save it
file_location = f"./uploads/{file.filename}"
with open(file_location, "wb+") as file_object:
file_object.write(await file.read())
results.append({"filename": file.filename, "content_type": file.content_type, "saved_at": file_location})
return {"files_processed": results}
এই পরিস্থিতিতে, ক্লায়েন্টকে একই ফর্ম ক্ষেত্র নামের সাথে একাধিক অংশ পাঠাতে হবে (যেমন, `files`)। ফাস্টএপিআই সেগুলিকে UploadFile অবজেক্টের একটি পাইথন তালিকায় সংগ্রহ করবে।
ফাইল এবং অন্যান্য ফর্ম ডেটা মিশ্রিত করা
ফর্মগুলিতে প্রায়শই ফাইল ক্ষেত্র এবং নিয়মিত টেক্সট ক্ষেত্র উভয়ই থাকে। ফাস্টএপিআই এটি পরিচালনা করে আপনাকে স্ট্যান্ডার্ড টাইপ এনোটেশন ব্যবহার করে অন্যান্য প্যারামিটার ঘোষণা করার অনুমতি দিয়ে, Form সহ ফর্ম ক্ষেত্রগুলির জন্য যা ফাইল নয়।
from fastapi import FastAPI, File, UploadFile, Form
from typing import List
app = FastAPI()
@app.post("/files/mixed/")
async def upload_mixed_data(
description: str = Form(...),
files: List[UploadFile] = File(...) # Accepts multiple files with the name 'files'
):
results = []
for file in files:
# Process each file
file_location = f"./uploads/{file.filename}"
with open(file_location, "wb+") as file_object:
file_object.write(await file.read())
results.append({"filename": file.filename, "content_type": file.content_type, "saved_at": file_location})
return {
"description": description,
"files_processed": results
}
Swagger UI বা Postman-এর মতো সরঞ্জামগুলি ব্যবহার করার সময়, আপনি একটি নিয়মিত ফর্ম ক্ষেত্র হিসাবে description উল্লেখ করবেন এবং তারপরে files ক্ষেত্রের জন্য একাধিক অংশ যোগ করবেন, প্রত্যেকটির বিষয়বস্তু প্রকার উপযুক্ত ছবি/নথির প্রকার হিসাবে সেট করা হয়েছে।
উন্নত বৈশিষ্ট্য এবং সেরা অনুশীলন
বেসিক ফাইল হ্যান্ডেলিংয়ের বাইরে, শক্তিশালী ফাইল আপলোড এপিআই তৈরির জন্য বেশ কয়েকটি উন্নত বৈশিষ্ট্য এবং সেরা অনুশীলন অত্যন্ত গুরুত্বপূর্ণ।
ফাইলের আকারের সীমা
আনলিমিটেড ফাইল আপলোডগুলি অনুমোদন করা পরিষেবা অস্বীকার আক্রমণ বা অতিরিক্ত সম্পদ খরচ করতে পারে। যদিও ফাস্টএপিআই ফ্রেমওয়ার্ক স্তরে ডিফল্টরূপে হার্ড সীমা প্রয়োগ করে না, তবে আপনার পরীক্ষাগুলি প্রয়োগ করা উচিত:
- অ্যাপ্লিকেশন স্তরে: এটি পাওয়ার পরে কিন্তু প্রক্রিয়া বা সংরক্ষণ করার আগে ফাইলের আকার পরীক্ষা করুন।
- ওয়েব সার্ভার/প্রক্সি স্তরে: আপনার ওয়েব সার্ভার (যেমন, Nginx, কর্মীদের সাথে Uvicorn) একটি নির্দিষ্ট পেলোড আকার অতিক্রম করে এমন অনুরোধগুলি প্রত্যাখ্যান করার জন্য কনফিগার করুন।
অ্যাপ্লিকেশন-স্তরের আকার পরীক্ষার উদাহরণ:
from fastapi import FastAPI, File, UploadFile, HTTPException
app = FastAPI()
MAX_FILE_SIZE_MB = 10
MAX_FILE_SIZE_BYTES = MAX_FILE_SIZE_MB * 1024 * 1024
@app.post("/files/limited_size/")
async def upload_with_size_limit(file: UploadFile = File(...)):
if len(await file.read()) > MAX_FILE_SIZE_BYTES:
raise HTTPException(status_code=400, detail=f"File is too large. Maximum size is {MAX_FILE_SIZE_MB}MB.")
# Reset file pointer to read content again
await file.seek(0)
# Proceed with saving or processing the file
file_location = f"./uploads/{file.filename}"
with open(file_location, "wb+") as file_object:
file_object.write(await file.read())
return {"info": f"File '{file.filename}' uploaded successfully."}
গুরুত্বপূর্ণ: ফাইলের আকার পরীক্ষা করার জন্য ফাইলটি পড়ার পরে, আপনি যদি এর বিষয়বস্তু আবার পড়তে চান (যেমন, এটি সংরক্ষণ করতে চান) তবে আপনাকে শুরু থেকে ফাইল পয়েন্টার রিসেট করতে await file.seek(0) ব্যবহার করতে হবে।
অনুমোদিত ফাইলের প্রকার (MIME প্রকার)
নির্দিষ্ট ফাইলের প্রকারগুলিতে আপলোড সীমাবদ্ধ করা সুরক্ষা বাড়ায় এবং ডেটা অখণ্ডতা নিশ্চিত করে। আপনি UploadFile অবজেক্টের content_type বৈশিষ্ট্য পরীক্ষা করতে পারেন।
from fastapi import FastAPI, File, UploadFile, HTTPException
app = FastAPI()
ALLOWED_FILE_TYPES = {"image/jpeg", "image/png", "application/pdf"}
@app.post("/files/restricted_types/")
async def upload_restricted_types(file: UploadFile = File(...)):
if file.content_type not in ALLOWED_FILE_TYPES:
raise HTTPException(status_code=400, detail=f"Unsupported file type: {file.content_type}. Allowed types are: {', '.join(ALLOWED_FILE_TYPES)}")
# Proceed with saving or processing the file
file_location = f"./uploads/{file.filename}"
with open(file_location, "wb+") as file_object:
file_object.write(await file.read())
return {"info": f"File '{file.filename}' uploaded successfully and is of an allowed type."}
আরও শক্তিশালী টাইপ পরীক্ষার জন্য, বিশেষ করে চিত্রগুলির জন্য, আপনি ফাইলের আসল বিষয়বস্তু পরীক্ষা করতে Pillow-এর মতো লাইব্রেরি ব্যবহার করার কথা বিবেচনা করতে পারেন, কারণ MIME প্রকারগুলি কখনও কখনও স্পুফ করা যেতে পারে।
ত্রুটি হ্যান্ডলিং এবং ব্যবহারকারীর প্রতিক্রিয়া
ব্যবহারকারীকে স্পষ্ট এবং কার্যকরী ত্রুটি বার্তা সরবরাহ করুন। স্ট্যান্ডার্ড HTTP ত্রুটি প্রতিক্রিয়াগুলির জন্য ফাস্টএপিআই-এর HTTPException ব্যবহার করুন।
- ফাইল পাওয়া যায়নি/নিখোঁজ: যদি একটি প্রয়োজনীয় ফাইল প্যারামিটার না পাঠানো হয়।
- ফাইলের আকার অতিক্রম করেছে: আকারের সীমা উদাহরণে দেখানো হয়েছে।
- অবৈধ ফাইলের প্রকার: প্রকার সীমাবদ্ধতা উদাহরণে দেখানো হয়েছে।
- সার্ভার ত্রুটি: ফাইল সংরক্ষণ বা প্রক্রিয়াকরণের সময় সমস্যাগুলির জন্য (যেমন, ডিস্ক পূর্ণ, অনুমতি ত্রুটি)।
সুরক্ষা বিবেচনা
ফাইল আপলোডগুলি নিরাপত্তা ঝুঁকি তৈরি করে:
- দূষিত ফাইল: কার্যকরযোগ্য ফাইল আপলোড করা (
.exe,.sh) বা অন্যান্য ফাইলের প্রকার হিসাবে ছদ্মবেশী স্ক্রিপ্ট। সর্বদা ফাইলের প্রকারগুলি যাচাই করুন এবং ম্যালওয়্যারের জন্য আপলোড করা ফাইলগুলি স্ক্যান করার কথা বিবেচনা করুন। - পাথ ট্রাভার্সাল: আক্রমণকারীদের অনিচ্ছাকৃত ডিরেক্টরিতে ফাইল আপলোড করা থেকে আটকাতে ফাইলের নাম স্যানিটাইজ করুন (যেমন,
../../etc/passwd-এর মতো ফাইলের নাম ব্যবহার করা)। ফাস্টএপিআই-এরUploadFileমৌলিক ফাইলের নাম স্যানিটাইজেশন পরিচালনা করে, তবে অতিরিক্ত যত্ন নেওয়া বিচক্ষণ। - পরিষেবা অস্বীকার: ফাইল আকারের সীমা এবং আপলোড এন্ডপয়েন্টগুলিতে সম্ভাব্য হারে সীমাবদ্ধতা প্রয়োগ করুন।
- ক্রস-সাইট স্ক্রিপটিং (XSS): আপনি যদি সরাসরি একটি ওয়েব পৃষ্ঠায় ফাইলের নাম বা ফাইলের বিষয়বস্তু প্রদর্শন করেন তবে নিশ্চিত করুন যে সেগুলি XSS আক্রমণগুলি প্রতিরোধ করার জন্য যথাযথভাবে এড়িয়ে যাওয়া হয়েছে।
সেরা অনুশীলন: আপনার ওয়েব সার্ভারের ডকুমেন্ট রুটের বাইরে আপলোড করা ফাইলগুলি সংরক্ষণ করুন এবং উপযুক্ত অ্যাক্সেস কন্ট্রোল সহ একটি ডেডিকেটেড এন্ডপয়েন্টের মাধ্যমে সেগুলিকে পরিবেশন করুন, অথবা একটি কন্টেন্ট ডেলিভারি নেটওয়ার্ক (CDN) ব্যবহার করুন।
ফাইল আপলোডগুলির সাথে পাইড্যান্টিক মডেল ব্যবহার করা
যদিও ফাইলগুলির জন্য UploadFile হল প্রাথমিক প্রকার, আপনি আরও জটিল ডেটা কাঠামোর জন্য ফাইল আপলোডগুলিকে পাইড্যান্টিক মডেলগুলিতে সংহত করতে পারেন। যাইহোক, স্ট্যান্ডার্ড পাইড্যান্টিক মডেলগুলির মধ্যে সরাসরি ফাইল আপলোড ক্ষেত্রগুলি মাল্টিপার্ট ফর্মগুলির জন্য স্থানীয়ভাবে সমর্থিত নয়। পরিবর্তে, আপনি সাধারণত ফাইলটিকে একটি পৃথক প্যারামিটার হিসাবে গ্রহণ করেন এবং তারপরে সম্ভবত এটিকে এমন একটি ফর্ম্যাটে প্রক্রিয়া করেন যা একটি পাইড্যান্টিক মডেল দ্বারা সংরক্ষণ বা যাচাই করা যেতে পারে।
একটি সাধারণ প্যাটার্ন হল মেটাডেটার জন্য একটি পাইড্যান্টিক মডেল থাকা এবং তারপরে ফাইলটি আলাদাভাবে গ্রহণ করা:
from fastapi import FastAPI, File, UploadFile, Form
from pydantic import BaseModel
from typing import Optional
class UploadMetadata(BaseModel):
title: str
description: Optional[str] = None
app = FastAPI()
@app.post("/files/model_metadata/")
async def upload_with_metadata(
metadata: str = Form(...), # Receive metadata as a JSON string
file: UploadFile = File(...)
):
import json
try:
metadata_obj = UploadMetadata(**json.loads(metadata))
except json.JSONDecodeError:
raise HTTPException(status_code=400, detail="Invalid JSON format for metadata")
except Exception as e:
raise HTTPException(status_code=400, detail=f"Error parsing metadata: {e}")
# Now you have metadata_obj and file
# Proceed with saving file and using metadata
file_location = f"./uploads/{file.filename}"
with open(file_location, "wb+") as file_object:
file_object.write(await file.read())
return {
"message": "File uploaded successfully with metadata",
"metadata": metadata_obj,
"filename": file.filename
}
এই প্যাটার্নে, ক্লায়েন্ট একটি ফর্ম ক্ষেত্রের মধ্যে একটি JSON স্ট্রিং হিসাবে মেটাডেটা পাঠায় (যেমন, metadata) এবং একটি পৃথক মাল্টিপার্ট অংশ হিসাবে ফাইলটি। সার্ভার তারপরে JSON স্ট্রিংটিকে একটি পাইড্যান্টিক অবজেক্টে পার্স করে।
বড় ফাইল আপলোড এবং অংশীকরণ
খুব বড় ফাইলের জন্য (যেমন, গিগাবাইট), এমনকি স্ট্রিমিংও ওয়েব সার্ভার বা ক্লায়েন্ট-সাইড সীমাবদ্ধতাগুলিকে আঘাত করতে পারে। একটি আরও উন্নত কৌশল হল খণ্ডযুক্ত আপলোড, যেখানে ক্লায়েন্ট ফাইলটিকে ছোট ছোট অংশে ভেঙে দেয় এবং সেগুলি পর্যায়ক্রমে বা সমান্তরালে আপলোড করে। সার্ভার তারপর এই খণ্ডগুলিকে পুনরায় একত্রিত করে। এর জন্য সাধারণত ক্লায়েন্ট-সাইড লজিক এবং একটি সার্ভার এন্ডপয়েন্ট প্রয়োজন যা খণ্ড ব্যবস্থাপনার জন্য ডিজাইন করা হয়েছে (যেমন, খণ্ড চিহ্নিত করা, অস্থায়ী সঞ্চয়স্থান এবং চূড়ান্ত সমাবেশ)।
যদিও ফাস্টএপিআই ক্লায়েন্ট-প্রবর্তিত খণ্ডযুক্ত আপলোডের জন্য অন্তর্নির্মিত সমর্থন প্রদান করে না, তবে আপনি আপনার ফাস্টএপিআই এন্ডপয়েন্টগুলির মধ্যে এই লজিক প্রয়োগ করতে পারেন। এর মধ্যে এমন এন্ডপয়েন্ট তৈরি করা জড়িত যা:
- পৃথক ফাইল খণ্ড গ্রহণ করে।
- এই খণ্ডগুলিকে অস্থায়ীভাবে সংরক্ষণ করে, সম্ভবত তাদের ক্রম এবং মোট খণ্ডের সংখ্যা নির্দেশ করে মেটাডেটা সহ।
- সমস্ত খণ্ড আপলোড করা হয়েছে এমন সংকেত দেওয়ার জন্য একটি এন্ডপয়েন্ট বা প্রক্রিয়া সরবরাহ করে, পুনরায় একত্রিতকরণ প্রক্রিয়াটিকে ট্রিগার করে।
এটি একটি আরও জটিল উদ্যোগ এবং প্রায়শই ক্লায়েন্ট সাইডে জাভাস্ক্রিপ্ট লাইব্রেরি জড়িত থাকে।
আন্তর্জাতিকীকরণ এবং বিশ্বায়ন বিবেচনা
যখন বিশ্বব্যাপী দর্শকদের জন্য এপিআই তৈরি করা হয়, তখন ফাইল আপলোডগুলির জন্য নির্দিষ্ট মনোযোগ প্রয়োজন:
- ফাইলের নাম: বিশ্বজুড়ে ব্যবহারকারীরা ফাইলের নামে নন-ASCII অক্ষর ব্যবহার করতে পারে (যেমন, অ্যাকসেন্ট, ভাবচিত্র)। নিশ্চিত করুন যে আপনার সিস্টেম এই ফাইলের নামগুলি সঠিকভাবে পরিচালনা করে এবং সংরক্ষণ করে। UTF-8 এনকোডিং সাধারণত স্ট্যান্ডার্ড, তবে গভীর সামঞ্জস্যের জন্য সতর্ক এনকোডিং/ডিকোডিং এবং স্যানিটাইজেশন প্রয়োজন হতে পারে।
- ফাইলের আকারের একক: যদিও MB এবং GB সাধারণ, ব্যবহারকারীরা ফাইলের আকার কীভাবে উপলব্ধি করে সে সম্পর্কে সচেতন থাকুন। ব্যবহারকারী-বান্ধব উপায়ে সীমা প্রদর্শন করা গুরুত্বপূর্ণ।
- বিষয়বস্তু প্রকার: ব্যবহারকারীরা কম সাধারণ MIME প্রকারের ফাইল আপলোড করতে পারে। নিশ্চিত করুন যে আপনার অনুমোদিত প্রকারের তালিকা আপনার ব্যবহারের ক্ষেত্রের জন্য ব্যাপক বা যথেষ্ট নমনীয়।
- আঞ্চলিক প্রবিধান: বিভিন্ন দেশে ডেটা রেসিডেন্সি আইন এবং প্রবিধান সম্পর্কে সচেতন থাকুন। আপলোড করা ফাইলগুলি সংরক্ষণ করার জন্য এই নিয়মগুলির সাথে সম্মতি প্রয়োজন হতে পারে।
- ব্যবহারকারী ইন্টারফেস: ফাইল আপলোডের জন্য ক্লায়েন্ট-সাইড ইন্টারফেসটি স্বজ্ঞাত হওয়া উচিত এবং ব্যবহারকারীর ভাষা এবং স্থানীয় সমর্থন করা উচিত।
পরীক্ষার জন্য সরঞ্জাম এবং লাইব্রেরি
ফাইল আপলোড এন্ডপয়েন্ট পরীক্ষা করা অত্যন্ত গুরুত্বপূর্ণ। এখানে কিছু সাধারণ সরঞ্জাম রয়েছে:
- সুইগার ইউআই (ইন্টারেক্টিভ এপিআই ডক্স): ফাস্টএপিআই স্বয়ংক্রিয়ভাবে সুইগার ইউআই ডকুমেন্টেশন তৈরি করে। আপনি সরাসরি ব্রাউজার ইন্টারফেস থেকে ফাইল আপলোড পরীক্ষা করতে পারেন। ফাইল ইনপুট ক্ষেত্রটি সন্ধান করুন এবং "ফাইল চয়ন করুন" বোতামটিতে ক্লিক করুন।
- পোস্টম্যান: একটি জনপ্রিয় এপিআই ডেভেলপমেন্ট এবং পরীক্ষার সরঞ্জাম। একটি ফাইল আপলোড অনুরোধ পাঠাতে:
- অনুরোধ পদ্ধতি POST এ সেট করুন।
- আপনার এপিআই এন্ডপয়েন্ট ইউআরএল লিখুন।
- "বডি" ট্যাবে যান।
- টাইপ হিসাবে "ফর্ম-ডেটা" নির্বাচন করুন।
- কী-ভ্যালু জোড়াতে, আপনার ফাইল প্যারামিটারের নাম লিখুন (যেমন,
file)। - টাইপ "টেক্সট" থেকে "ফাইল" এ পরিবর্তন করুন।
- আপনার স্থানীয় সিস্টেম থেকে একটি ফাইল নির্বাচন করতে "ফাইল চয়ন করুন" এ ক্লিক করুন।
- আপনার যদি অন্যান্য ফর্ম ক্ষেত্র থাকে তবে সেগুলিকে একইভাবে যুক্ত করুন, তাদের প্রকার "টেক্সট" হিসাবে রেখে।
- অনুরোধটি পাঠান।
- cURL: HTTP অনুরোধ করার জন্য একটি কমান্ড-লাইন সরঞ্জাম।
- একটি ফাইলের জন্য:
curl -X POST -F "file=@/path/to/your/local/file.txt" http://localhost:8000/files/ - একাধিক ফাইলের জন্য:
curl -X POST -F "files=@/path/to/file1.txt" -F "files=@/path/to/file2.png" http://localhost:8000/files/multiple/ - মিশ্র ডেটার জন্য:
curl -X POST -F "description=আমার বর্ণনা" -F "files=@/path/to/file.txt" http://localhost:8000/files/mixed/ - পাইথনের `requests` লাইব্রেরি: প্রোগ্রাম্যাটিক পরীক্ষার জন্য।
import requests
url = "http://localhost:8000/files/save/"
files = {'file': open('/path/to/your/local/file.txt', 'rb')}
response = requests.post(url, files=files)
print(response.json())
# For multiple files
url_multiple = "http://localhost:8000/files/multiple/"
files_multiple = {
'files': [('file1.txt', open('/path/to/file1.txt', 'rb')),
('image.png', open('/path/to/image.png', 'rb'))]
}
response_multiple = requests.post(url_multiple, files=files_multiple)
print(response_multiple.json())
# For mixed data
url_mixed = "http://localhost:8000/files/mixed/"
data = {'description': 'Test description'}
files_mixed = {'files': open('/path/to/another_file.txt', 'rb')}
response_mixed = requests.post(url_mixed, data=data, files=files_mixed)
print(response_mixed.json())
উপসংহার
ফাস্টএপিআই মাল্টিপার্ট ফাইল আপলোডগুলি পরিচালনা করার জন্য একটি শক্তিশালী, দক্ষ এবং স্বজ্ঞাত উপায় সরবরাহ করে। UploadFile টাইপ এবং অ্যাসিনক্রোনাস প্রোগ্রামিং-এর সুবিধা গ্রহণ করে, ডেভেলপাররা শক্তিশালী এপিআই তৈরি করতে পারে যা নির্বিঘ্নে ফাইল হ্যান্ডলিং ক্ষমতাকে সংহত করে। নিরাপত্তা অগ্রাধিকার দিতে, উপযুক্ত ত্রুটি হ্যান্ডলিং প্রয়োগ করতে এবং ফাইলের নাম এনকোডিং এবং নিয়ন্ত্রক সম্মতির মতো দিকগুলি সমাধান করে একটি বিশ্বব্যাপী ব্যবহারকারী বেসের প্রয়োজনগুলি বিবেচনা করতে ভুলবেন না।
আপনি একটি সাধারণ চিত্র শেয়ারিং পরিষেবা তৈরি করছেন বা একটি জটিল ডকুমেন্ট প্রক্রিয়াকরণ প্ল্যাটফর্ম, ফাস্টএপিআই-এর ফাইল আপলোড বৈশিষ্ট্যগুলিতে দক্ষতা অর্জন করা একটি গুরুত্বপূর্ণ সম্পদ হবে। এর ক্ষমতাগুলি অন্বেষণ করতে থাকুন, সেরা অনুশীলনগুলি প্রয়োগ করুন এবং আপনার আন্তর্জাতিক দর্শকদের জন্য ব্যতিক্রমী ব্যবহারকারীর অভিজ্ঞতা সরবরাহ করুন।