Flask-এ File Download ম্যানেজমেন্ট একটি গুরুত্বপূর্ণ ফিচার যা ওয়েব অ্যাপ্লিকেশনগুলোতে ব্যবহারকারীদের জন্য ফাইল শেয়ার বা ডাউনলোডের সুযোগ দেয়। Flask-এ ফাইল ডাউনলোড ব্যবস্থাপনা সহজ এবং এটি send_file() এবং send_from_directory() ফাংশনগুলির মাধ্যমে করা হয়।
এই টিউটোরিয়ালে Flask দিয়ে ফাইল ডাউনলোড করার জন্য প্রয়োজনীয় পদ্ধতি এবং উদাহরণ দেখানো হবে।
১. Flask-এ File Download ম্যানেজমেন্ট
Flask-এ ফাইল ডাউনলোড ম্যানেজ করার জন্য সাধারণত দুইটি ফাংশন ব্যবহার করা হয়:
send_file(): একটি নির্দিষ্ট ফাইল সরাসরি ক্লায়েন্টের কাছে পাঠায়।send_from_directory(): একটি নির্দিষ্ট ডিরেক্টরি থেকে ফাইল পাঠানোর জন্য ব্যবহৃত হয়।
২. Flask দিয়ে ফাইল ডাউনলোড উদাহরণ
ধাপ ১: Flask অ্যাপ সেটআপ
প্রথমে, Flask অ্যাপ তৈরি করা এবং ডাউনলোড করার জন্য একটি ফোল্ডার তৈরি করা হবে।
mkdir flask_file_download
cd flask_file_download
ধাপ ২: Flask ইনস্টলেশন
আপনি যদি Flask ইনস্টল না করে থাকেন, তাহলে Flask ইনস্টল করতে হবে:
pip install flask
ধাপ ৩: Flask অ্যাপ তৈরি
এখন একটি Flask অ্যাপ তৈরি করুন এবং send_file() ব্যবহার করে ফাইল ডাউনলোডের জন্য রাউট তৈরি করুন।
from flask import Flask, send_file
app = Flask(__name__)
@app.route("/download/<filename>")
def download_file(filename):
try:
# এখানে ফাইলের পাথ নির্ধারণ করা হচ্ছে
return send_file(f'files/{filename}', as_attachment=True)
except Exception as e:
return f"Error: {e}"
if __name__ == "__main__":
app.run(debug=True)
এখানে:
send_file(f'files/{filename}', as_attachment=True): এটিfiles/ফোল্ডার থেকে একটি ফাইল পাঠাবে এবংas_attachment=Trueসেট করার মাধ্যমে ফাইলটি ডাউনলোড হিসেবে প্রেরণ করা হবে।
৩. Flask-এ send_from_directory() ব্যবহার
Flask-এ send_from_directory() ফাংশনটি ফাইলগুলোকে একটি নির্দিষ্ট ডিরেক্টরি থেকে পাঠানোর জন্য ব্যবহৃত হয়, এটি আরো নিরাপদ এবং ফাইলের জন্য সঠিক পথ নিশ্চিত করতে সাহায্য করে।
from flask import Flask, send_from_directory
import os
app = Flask(__name__)
@app.route("/download/<filename>")
def download_file(filename):
try:
directory = os.path.join(app.root_path, 'files') # 'files' ফোল্ডার
return send_from_directory(directory, filename, as_attachment=True)
except Exception as e:
return f"Error: {e}"
if __name__ == "__main__":
app.run(debug=True)
এখানে:
send_from_directory(directory, filename, as_attachment=True): এটি ফাইলটি নির্দিষ্ট ডিরেক্টরি থেকে পাঠাবে এবং ডাউনলোড হিসেবে অ্যাটাচ করবে।os.path.join(): এটি ফোল্ডারের সঠিক পাথ তৈরি করতে ব্যবহৃত হয়েছে।
৪. File Download ফোল্ডার স্ট্রাকচার
প্রজেক্ট ফোল্ডারের মধ্যে ফাইলগুলি সঠিকভাবে সংরক্ষিত থাকতে হবে, যাতে Flask সেগুলো ডাউনলোড করতে পারে।
ফোল্ডার স্ট্রাকচার:
flask_file_download/
├── app.py # Flask অ্যাপ
└── files/ # ফাইলগুলো সংরক্ষণের জন্য ফোল্ডার
├── file1.txt
├── file2.pdf
└── image.jpg
এখানে:
app.py: Flask অ্যাপের ফাইল।files/: ফোল্ডার যেখানে ডাউনলোড করার জন্য ফাইলগুলো সংরক্ষিত রয়েছে।
৫. Security Considerations
Flask অ্যাপ্লিকেশনে ফাইল ডাউনলোড ম্যানেজ করার সময় কিছু নিরাপত্তা বিষয় বিবেচনা করা জরুরি:
- File Path Validation: ফাইলের পাথ সঠিকভাবে যাচাই করা জরুরি, যাতে ব্যবহারকারীরা আপত্তিকর ফাইল অ্যাক্সেস করতে না পারে।
- Extension Check: ফাইলের এক্সটেনশন যাচাই করতে পারেন যাতে শুধুমাত্র নির্দিষ্ট ধরনের ফাইল ডাউনলোড করা যায়।
- Directory Traversal Protection: ব্যবহারকারীদের যদি পাথ পরিবর্তন করতে দেওয়া হয়, তাহলে এটি বিপজ্জনক হতে পারে, সেজন্য সঠিক পাথ যাচাইয়ের মাধ্যমে Directory Traversal আক্রমণ প্রতিরোধ করা উচিত।
উদাহরণ: ফাইল এক্সটেনশন চেক করা
from flask import Flask, send_from_directory, abort
import os
app = Flask(__name__)
@app.route("/download/<filename>")
def download_file(filename):
allowed_extensions = ['txt', 'pdf', 'jpg']
file_extension = filename.split('.')[-1]
if file_extension not in allowed_extensions:
abort(400, description="Invalid file type")
directory = os.path.join(app.root_path, 'files')
return send_from_directory(directory, filename, as_attachment=True)
if __name__ == "__main__":
app.run(debug=True)
এখানে:
allowed_extensions: শুধুমাত্র নির্দিষ্ট ফাইল এক্সটেনশন চেক করা হচ্ছে (যেমন.txt,.pdf,.jpg)।
৬. File Download with Progress Bar
Flask অ্যাপে ফাইল ডাউনলোডের সময় progress bar দেখানো সাধারণত JavaScript এবং AJAX ব্যবহার করে করা হয়। তবে Flask নিজে থেকে ফাইল ডাউনলোডের জন্য এক্সট্রা ফিচার সরবরাহ করে না, তবে এটি range requests এবং JavaScript ব্যবহার করে অর্জন করা সম্ভব।
Flask-এ ফাইল ডাউনলোড ম্যানেজমেন্ট খুবই সহজ এবং শক্তিশালী। আপনি send_file() অথবা send_from_directory() ফাংশন ব্যবহার করে ফাইল ডাউনলোড পরিচালনা করতে পারেন। তবে, ফাইল ডাউনলোডের সময় নিরাপত্তা বিষয়গুলো যেমন ফাইল এক্সটেনশন যাচাই, পাথ ভ্যালিডেশন এবং Directory Traversal আক্রমণ প্রতিরোধ করা খুবই গুরুত্বপূর্ণ।