Flask দিয়ে Multiple File Upload এবং File Validation করা একটি গুরুত্বপূর্ণ কাজ, যা ব্যবহারকারীদের একাধিক ফাইল আপলোড করার সুবিধা দেয় এবং ফাইলগুলোর ধরন, আকার ইত্যাদি যাচাই করে নিরাপত্তা নিশ্চিত করতে সাহায্য করে।
Flask-এ ফাইল আপলোড করার জন্য request.files ব্যবহার করা হয় এবং ফাইলের বৈধতা যাচাই করার জন্য Werkzeug বা নিজস্ব কাস্টম লজিক ব্যবহার করা যায়। Flask-এর মাধ্যমে একাধিক ফাইল আপলোড করা এবং সেগুলোর ভ্যালিডেশন করতে পারবেন খুব সহজে।
১. Multiple File Upload (একাধিক ফাইল আপলোড)
Flask-এ একাধিক ফাইল আপলোড করার জন্য ফর্মে multiple অ্যাট্রিবিউট যুক্ত করতে হবে এবং Flask অ্যাপে request.files ব্যবহার করে আপলোড করা ফাইলগুলোর অ্যাক্সেস করতে হবে।
উদাহরণ:
from flask import Flask, request
app = Flask(__name__)
@app.route("/upload", methods=["GET", "POST"])
def upload_files():
if request.method == "POST":
files = request.files.getlist('files') # একাধিক ফাইল নির্বাচন করা
for file in files:
file.save(f'./uploads/{file.filename}') # প্রতিটি ফাইল সেভ করা
return f"{len(files)} ফাইল সফলভাবে আপলোড হয়েছে!"
return '''
<form method="post" enctype="multipart/form-data">
ফাইল নির্বাচন করুন: <input type="file" name="files" multiple><br>
<input type="submit" value="আপলোড">
</form>
'''
if __name__ == "__main__":
app.run(debug=True)
এখানে:
request.files.getlist('files'): এটি ফর্মেmultipleঅ্যাট্রিবিউট সহ একাধিক ফাইল নির্বাচন করতে সহায়ক।file.save(): প্রতিটি ফাইলকে সিস্টেমে নির্দিষ্ট অবস্থানে সেভ করা হচ্ছে।
এখন, আপনি ফর্ম ব্যবহার করে একাধিক ফাইল নির্বাচন করতে পারেন এবং POST রিকোয়েস্ট সাবমিট করলে সেই ফাইলগুলো সেভ হবে।
২. File Validation (ফাইল ভ্যালিডেশন)
ফাইল আপলোড করার আগে আপনি তার বৈধতা যাচাই করতে পারেন, যেমন ফাইলের ধরন (ফাইল এক্সটেনশন), ফাইলের আকার ইত্যাদি যাচাই করতে পারেন। Flask-এ ফাইল ভ্যালিডেশন করার জন্য আপনি নিম্নলিখিত বিষয়গুলো পরীক্ষা করতে পারেন:
- ফাইলের এক্সটেনশন
- ফাইলের আকার
- ফাইলের নাম (সিদ্ধান্ত গ্রহণযোগ্য নাম)
উদাহরণ:
from flask import Flask, request
import os
app = Flask(__name__)
# নির্দিষ্ট ফাইল এক্সটেনশন এবং আকার নির্ধারণ
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
MAX_CONTENT_LENGTH = 16 * 1024 * 1024 # 16 MB পর্যন্ত ফাইল আপলোড
# ফাইল এক্সটেনশন যাচাই করার ফাংশন
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route("/upload", methods=["GET", "POST"])
def upload_files():
if request.method == "POST":
files = request.files.getlist('files')
for file in files:
# ফাইলের নাম যাচাই
if file.filename == '':
return "ফাইলের নাম দেওয়া হয়নি", 400
# ফাইলের বৈধতা যাচাই
if file and allowed_file(file.filename):
# ফাইল সাইজ যাচাই
if len(file.read()) > MAX_CONTENT_LENGTH:
return "ফাইলের আকার খুব বড়", 400
file.seek(0) # ফাইলের পয়েন্টার ফিরে আনা
# ফাইল সেভ করা
file.save(os.path.join('./uploads', file.filename))
else:
return "অবৈধ ফাইল ফরম্যাট", 400
return f"{len(files)} ফাইল সফলভাবে আপলোড হয়েছে!"
return '''
<form method="post" enctype="multipart/form-data">
ফাইল নির্বাচন করুন: <input type="file" name="files" multiple><br>
<input type="submit" value="আপলোড">
</form>
'''
if __name__ == "__main__":
app.run(debug=True)
এখানে:
allowed_file(): এটি ফাইলের এক্সটেনশন যাচাই করে। শুধুমাত্র অনুমোদিত এক্সটেনশন (যেমনpng,jpg,jpeg,gif) এর ফাইল আপলোড করা যাবে।MAX_CONTENT_LENGTH: এটি আপলোড করা ফাইলের সর্বাধিক আকার নির্ধারণ করে (এখানে 16 MB)। আপনি যদি বড় ফাইল আপলোড করার চেষ্টা করেন, তাহলে এটি413 Request Entity Too Largeএর মতো একটি ত্রুটি ফিরিয়ে দিবে।file.filename == '': ফাইল নাম না দেওয়া হলে একটি ত্রুটি ফেরত দেবে।
ইউজার ইন্টারফেস:
- ফর্মের মাধ্যমে একাধিক ফাইল নির্বাচন করা যাবে।
- আপলোডের পর, আপনি ফাইলের বৈধতা যাচাই করে সেগুলো সেভ করতে পারবেন।
৩. ফাইল সেভিংয়ের নিরাপত্তা নিশ্চিত করা
ফাইল সেভ করার সময় কিছু নিরাপত্তা ঝুঁকি থাকে, যেমন ফাইলের নামের মাধ্যমে ম্যালওয়্যার চালানোর সুযোগ। সেজন্য, ফাইল সেভ করার আগে কিছু নিরাপত্তা প্রক্রিয়া অনুসরণ করা উচিত:
- ফাইল নাম পরিস্কার (Sanitize File Name): ফাইল নামটি পরিস্কার করুন এবং এক্সটেনশন চেক করুন।
- ফাইলের নতুন নাম দেওয়া: ফাইলের আসল নামের পরিবর্তে নতুন নাম দিতে পারেন যাতে কোন ধরনের ফাইল ইঞ্জেকশন আক্রমণ এড়ানো যায়।
from werkzeug.utils import secure_filename
import uuid
@app.route("/upload", methods=["GET", "POST"])
def upload_files():
if request.method == "POST":
files = request.files.getlist('files')
for file in files:
if file and allowed_file(file.filename):
# ফাইল নাম স্যানিটাইজ
filename = secure_filename(file.filename)
# নতুন ইউনিক নাম প্রদান
filename = f"{uuid.uuid4().hex}_{filename}"
file.save(os.path.join('./uploads', filename))
return f"{len(files)} ফাইল সফলভাবে আপলোড হয়েছে!"
return '''
<form method="post" enctype="multipart/form-data">
ফাইল নির্বাচন করুন: <input type="file" name="files" multiple><br>
<input type="submit" value="আপলোড">
</form>
'''
এখানে:
secure_filename(): এটি ফাইলের নাম স্যানিটাইজ করে, যেমন এক্সট্রা ক্যারেক্টারগুলো মুছে দেয়, যা নিরাপত্তার জন্য গুরুত্বপূর্ণ।uuid.uuid4().hex: ইউনিক ফাইল নামের জন্য UUID ব্যবহার করা হয়েছে যাতে একই নামের ফাইলের সাথে সংঘর্ষ না হয়।
Flask-এ Multiple File Upload এবং File Validation হ্যান্ডলিং খুবই সহজ এবং কার্যকর। Flask-এ একাধিক ফাইল আপলোড করার জন্য request.files.getlist() ব্যবহার করা হয়, এবং ফাইলের বৈধতা যাচাই করার জন্য এক্সটেনশন চেক, সাইজ চেক এবং নাম স্যানিটাইজ করার মতো বিভিন্ন পদ্ধতি ব্যবহৃত হয়। ফাইল সেভ করার সময় নিরাপত্তা ঝুঁকি এড়াতে সঠিক যাচাই-বাছাই প্রক্রিয়া গুরুত্বপূর্ণ।
Read more