Flask এর File Handling এবং File Download

ফ্লাস্ক (Flask) - Web Development

370

Flask-এ ফাইল হ্যান্ডলিং খুবই সহজ এবং নমনীয়। আপনি Flask অ্যাপ্লিকেশন তৈরি করে ফাইল আপলোড, ডাউনলোড, এবং ফাইল পরিচালনা করতে পারেন। এখানে আমরা Flask-এ ফাইল আপলোড এবং ডাউনলোড করার প্রক্রিয়া শিখবো, যা সাধারণত ওয়েব অ্যাপ্লিকেশন ডেভেলপমেন্টে ব্যবহৃত হয়।


১. Flask-এ File Uploading

Flask-এ ফাইল আপলোড করতে request অবজেক্ট এবং FileStorage ব্যবহার করা হয়। Flask স্বয়ংক্রিয়ভাবে ফাইল আপলোডের জন্য একটি request.files ডিকশনারি প্রদান করে। ফাইলটি ফর্মের মাধ্যমে আপলোড করা হয়।

উদাহরণ: ফাইল আপলোড করা

from flask import Flask, render_template, request, redirect, url_for
import os

app = Flask(__name__)

# ফাইল আপলোডের জন্য ডিরেক্টরি সেট করা
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}

# ফাইলের এক্সটেনশন যাচাই করা
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']

@app.route("/", methods=["GET", "POST"])
def upload_file():
    if request.method == "POST":
        # ফাইল যাচাই করা
        file = request.files['file']
        if file and allowed_file(file.filename):
            # ফাইল নাম সেট করা এবং আপলোড করা
            filename = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
            file.save(filename)
            return f"ফাইল সফলভাবে আপলোড হয়েছে: {file.filename}"
    return '''
    <!doctype html>
    <title>ফাইল আপলোড করুন</title>
    <h1>ফাইল আপলোড করুন</h1>
    <form method="POST" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="আপলোড">
    </form>
    '''

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • request.files['file']: এই অংশটি ফাইলের ডেটা গ্রহণ করে।
  • allowed_file(filename): ফাইলের এক্সটেনশন যাচাই করে, যাতে শুধুমাত্র নির্দিষ্ট ধরনের ফাইল (যেমন PNG, JPG) আপলোড করা যায়।
  • file.save(filename): আপলোড করা ফাইল নির্দিষ্ট ডিরেক্টরিতে সংরক্ষণ করা হয়।

ফাইল আপলোড করার জন্য HTML ফর্ম:

<form method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="আপলোড">
</form>

এখানে:

  • enctype="multipart/form-data": এটি ফর্মের মাধ্যমে ফাইল পাঠানোর জন্য প্রয়োজনীয় এ্যাট্রিবিউট।

২. Flask-এ File Downloading

Flask-এ ফাইল ডাউনলোড করতে, আপনি send_from_directory() ফাংশন ব্যবহার করতে পারেন, যা নির্দিষ্ট ডিরেক্টরি থেকে ফাইল সরবরাহ করে।

উদাহরণ: ফাইল ডাউনলোড করা

from flask import Flask, send_from_directory, safe_join
import os

app = Flask(__name__)

# ফাইল ডাউনলোডের জন্য ডিরেক্টরি
app.config['UPLOAD_FOLDER'] = 'uploads/'

@app.route('/uploads/<filename>')
def download_file(filename):
    # ফাইলের সঠিক পাথ নিশ্চিত করা
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • send_from_directory(): এটি Flask এর একটি বিল্ট-ইন ফাংশন, যা নির্দিষ্ট ডিরেক্টরি থেকে ফাইল সরবরাহ করে।
  • <filename>: ডাইনামিক URL প্যারামিটার হিসেবে ফাইলের নাম গ্রহণ করে।

ফাইল ডাউনলোড করার জন্য URL:

ফাইল ডাউনলোড করতে URL হবে:

http://127.0.0.1:5000/uploads/filename.ext

এখানে, filename.ext আপনার আপলোড করা ফাইলের নাম।


৩. File Handling Security

Flask অ্যাপ্লিকেশনগুলিতে ফাইল হ্যান্ডলিং করার সময় কিছু নিরাপত্তা ব্যবস্থাপনা করা অত্যন্ত গুরুত্বপূর্ণ, যেমন:

  • File Extensions Checking: শুধু নির্দিষ্ট ধরনের ফাইল (যেমন PNG, JPG) আপলোড করা অনুমোদিত করা।
  • File Path Validation: ফাইল সিস্টেমের মধ্যে নিরাপদ অবস্থানে ফাইল সংরক্ষণ করা, যাতে ফাইল পাথের মাধ্যমে অবৈধ অ্যাক্সেস না হয়।
  • File Size Limitation: অতিরিক্ত বড় ফাইল আপলোড হওয়া প্রতিরোধ করা।

ফাইল সাইজ সীমাবদ্ধতা সেট করা:

app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16 MB

এটি ফাইল সাইজ 16MB এর বেশি হলে আপলোড গ্রহণ করবে না।


৪. Flask-এ File Upload এবং Download Handling Example

ফাইল আপলোড এবং ডাউনলোডের সম্পূর্ণ উদাহরণ:

from flask import Flask, render_template, request, send_from_directory
import os

app = Flask(__name__)

# ফাইল আপলোডের জন্য ডিরেক্টরি
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # Max file size 16MB
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif'}

# ফাইল এক্সটেনশন যাচাই করা
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']

@app.route("/", methods=["GET", "POST"])
def upload_file():
    if request.method == "POST":
        file = request.files['file']
        if file and allowed_file(file.filename):
            filename = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
            file.save(filename)
            return f"ফাইল সফলভাবে আপলোড হয়েছে: {file.filename}"
    return '''
    <!doctype html>
    <title>ফাইল আপলোড করুন</title>
    <h1>ফাইল আপলোড করুন</h1>
    <form method="POST" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="আপলোড">
    </form>
    '''

@app.route('/uploads/<filename>')
def download_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • File Upload: ফর্মের মাধ্যমে ফাইল আপলোড করা হয় এবং uploads/ ফোল্ডারে সেভ করা হয়।
  • File Download: http://127.0.0.1:5000/uploads/filename URL দিয়ে আপলোড করা ফাইল ডাউনলোড করা যাবে।

Flask-এ File Handling খুবই সহজ এবং নমনীয়। আপনি ফাইল আপলোড এবং ফাইল ডাউনলোড করতে পারেন এবং প্রয়োজন অনুযায়ী নিরাপত্তা ব্যবস্থা যেমন ফাইল সাইজ সীমাবদ্ধতা, ফাইল এক্সটেনশন যাচাই, এবং ফাইল পাথ নিরাপত্তা যোগ করতে পারেন। Flask এর send_from_directory() ফাংশন ফাইল ডাউনলোড ব্যবস্থাপনার জন্য কার্যকরী এবং request.files ফাংশন ফাইল আপলোড করার জন্য ব্যবহার করা হয়।

Content added By

Flask-এ File Upload এবং File Handling খুবই সহজ এবং শক্তিশালী ফিচার। আপনি Flask অ্যাপ্লিকেশনে ফাইল আপলোড এবং সেগুলোর পরিচালনা করার জন্য কনফিগারেশন এবং কোড ব্যবহার করতে পারেন। Flask-এ ফাইল আপলোড করতে request.files অবজেক্ট এবং ফাইল সেভ করতে secure_filename() ফাংশন ব্যবহার করা হয়।

এখানে Flask অ্যাপ্লিকেশনে ফাইল আপলোড এবং ফাইল হ্যান্ডলিং কনফিগার করার পদ্ধতি দেখানো হবে।


১. Flask File Upload কনফিগারেশন

Flask-এ ফাইল আপলোড করতে UPLOAD_FOLDER কনফিগারেশন সেট করা হয়, যাতে আপলোড করা ফাইল সেভ করা যায়। এছাড়াও, ফাইলের ধরন এবং আকার নির্ধারণ করা হয়।

ধাপ ১: Flask অ্যাপ্লিকেশন সেটআপ করা

প্রথমে Flask অ্যাপ তৈরি করুন এবং ফাইল আপলোডের জন্য কনফিগারেশন সেট করুন:

from flask import Flask, request, render_template, redirect, url_for, flash
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)

# ফাইল আপলোডের কনফিগারেশন
app.config['UPLOAD_FOLDER'] = 'uploads/'  # ফোল্ডারের পাথ যেখানে ফাইল সেভ হবে
app.config['ALLOWED_EXTENSIONS'] = {'png', 'jpg', 'jpeg', 'gif', 'pdf'}  # অনুমোদিত এক্সটেনশন
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # সর্বাধিক ফাইল আকার 16MB

# ফাইল এক্সটেনশন চেক করার জন্য ফাংশন
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS']

@app.route('/')
def home():
    return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        flash('No file part')
        return redirect(request.url)
    
    file = request.files['file']
    
    if file.filename == '':
        flash('No selected file')
        return redirect(request.url)
    
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)  # সিকিউর ফাইল নাম
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))  # ফাইল সেভ করা
        flash('File successfully uploaded')
        return redirect(url_for('home'))
    else:
        flash('File type not allowed')
        return redirect(request.url)

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • UPLOAD_FOLDER: ফোল্ডার যেখানে আপলোড করা ফাইল সেভ হবে।
  • ALLOWED_EXTENSIONS: শুধুমাত্র নির্দিষ্ট এক্সটেনশনের ফাইলগুলোকে অনুমোদিত করা হয়েছে (যেমন, .png, .jpg, .jpeg, .pdf ইত্যাদি)।
  • MAX_CONTENT_LENGTH: সর্বাধিক ফাইল আকার 16MB নির্ধারণ করা হয়েছে। আপনি এটি পরিবর্তন করতে পারেন।

২. HTML ফর্ম তৈরি করা

ফাইল আপলোডের জন্য একটি HTML ফর্ম তৈরি করতে হবে।

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>File Upload</title>
</head>
<body>
    <h1>Upload a File</h1>
    <form action="/upload" method="POST" enctype="multipart/form-data">
        <input type="file" name="file">
        <button type="submit">Upload</button>
    </form>
    
    {% with messages = get_flashed_messages() %}
        {% if messages %}
            <ul>
            {% for message in messages %}
                <li>{{ message }}</li>
            {% endfor %}
            </ul>
        {% endif %}
    {% endwith %}
</body>
</html>

এখানে:

  • enctype="multipart/form-data": ফর্মে ফাইল আপলোডের জন্য এই অ্যাট্রিবিউটটি নির্ধারণ করতে হবে।
  • <input type="file" name="file">: ফাইল ইনপুট ফিল্ড।

৩. File Handling (সেভ, রিড, এবং ডিলিট)

ফাইল সেভ করা:

ফাইল সেভ করতে file.save() ফাংশন ব্যবহার করা হয়, যা আপলোড করা ফাইলটি নির্দিষ্ট ফোল্ডারে সেভ করে।

file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

ফাইল রিড করা:

আপনি ফাইল সিস্টেম থেকে ফাইল রিড করতে পারেন, যেমন একটি পিডিএফ বা ইমেজ ফাইল শো করার জন্য।

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'], filename)

ফাইল ডিলিট করা:

আপনি ফাইলটি ডিলিট করতে পারেন os.remove() ফাংশন দিয়ে:

import os

@app.route('/delete/<filename>')
def delete_file(filename):
    file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename)
    if os.path.exists(file_path):
        os.remove(file_path)
        flash('File deleted successfully')
    else:
        flash('File not found')
    return redirect(url_for('home'))

৪. File Upload Example Testing

Flask অ্যাপ চালানোর পর, ব্রাউজারে http://127.0.0.1:5000/ URL এ গিয়ে ফাইল আপলোড ফর্ম দেখতে পাবেন। এখানে আপনি একটি ফাইল সিলেক্ট করে আপলোড করতে পারবেন এবং সফলভাবে আপলোড হলে একটি মেসেজ দেখাবে।

আপলোড করা ফাইলটি uploads/ ফোল্ডারে সেভ হবে। আপনি সেই ফাইলটি সিস্টেমে দেখতে পারবেন।


৫. File Upload নিরাপত্তা টিপস

  1. File Type Validation: শুধুমাত্র অনুমোদিত ফাইল এক্সটেনশন (যেমন .jpg, .png, .pdf) আপলোডের অনুমতি দিন।
    • allowed_file() ফাংশন ব্যবহার করে ফাইল টাইপ চেক করা হয়েছে।
  2. File Size Limitation: ফাইলের আকার সীমাবদ্ধ করুন, যেমন 16MB (এটি MAX_CONTENT_LENGTH দিয়ে করা হয়েছে)।
  3. File Name Sanitization: ফাইল নাম সিকিউর করার জন্য secure_filename() ব্যবহার করুন। এটি কোনও বিশেষ চিহ্ন বা অপ্রত্যাশিত অক্ষর ফাইল নাম থেকে সরিয়ে দেয়।
  4. Use Separate Directory for Uploads: আপলোড করা ফাইলগুলির জন্য একটি আলাদা ফোল্ডার ব্যবহার করুন এবং সেটিকে ওয়েব সার্ভার থেকে সুরক্ষিত রাখুন।

Flask-এ File Upload এবং File Handling একটি সহজ এবং কার্যকরী প্রক্রিয়া। আপনি secure_filename() ব্যবহার করে ফাইল নাম সুরক্ষিত করতে পারেন, request.files দ্বারা ফাইল গ্রহণ করতে পারেন এবং save() ফাংশন দ্বারা সেগুলি সেভ করতে পারেন। ফাইল সাইজ লিমিটেশন এবং ফাইল টাইপ ভ্যালিডেশন ব্যবহার করে আপনি সুরক্ষিতভাবে ফাইল আপলোড করতে পারেন। Flask-এ এই ফিচারটি সহজে ইন্টিগ্রেট করা যায় এবং এটি আপনার অ্যাপ্লিকেশনের কার্যকারিতা বাড়ায়।

Content added By

Flask-এ ফাইল আপলোড এবং নিরাপত্তা ব্যবস্থাপনা অত্যন্ত গুরুত্বপূর্ণ। ব্যবহারকারীরা ফাইল আপলোড করার সময় বিভিন্ন ধরনের নিরাপত্তা ঝুঁকি থাকতে পারে, যেমন ম্যালিশিয়াস ফাইল, অতিরিক্ত বড় ফাইল বা ক্ষতিকারক স্ক্রিপ্ট ফাইল। Flask-এ ফাইল আপলোড করার সময় File Validation এবং Security Management করার জন্য কিছু পদ্ধতি রয়েছে, যা আপনার অ্যাপ্লিকেশনকে নিরাপদ রাখতে সহায়তা করবে।

১. Flask-এ File Upload

Flask অ্যাপ্লিকেশনে ফাইল আপলোড করা বেশ সহজ। ফাইল আপলোড করার জন্য Flask-এর request.files ব্যবহার করা হয়, যেখানে ফাইলগুলো POST রিকোয়েস্টের মাধ্যমে পাঠানো হয়। প্রথমে আপনাকে UPLOAD_FOLDER এবং ফাইলের সর্বোচ্চ সাইজ সীমাবদ্ধতা (MAX_CONTENT_LENGTH) সেট করতে হবে।


২. Flask-এ File Validation

ফাইল আপলোড করার সময় ফাইলের বৈধতা পরীক্ষা করা গুরুত্বপূর্ণ, যেমন ফাইলের ধরন, সাইজ এবং এক্সটেনশন। Flask-এ ফাইলের ভ্যালিডেশন করতে secure_filename() ব্যবহার করা হয়, যা ফাইলের নাম সুরক্ষিত করে এবং ফাইলের টাইপ চেক করতে allowed_file() ফাংশন ব্যবহার করা হয়।

উদাহরণ:

from flask import Flask, request, redirect, url_for
from werkzeug.utils import secure_filename
import os

app = Flask(__name__)

# আপলোড ফোল্ডার এবং ফাইলের সর্বোচ্চ সাইজ সীমা নির্ধারণ
app.config['UPLOAD_FOLDER'] = 'uploads/'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 16 MB

# অনুমোদিত ফাইল এক্সটেনশন
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}

# ফাইলের এক্সটেনশন যাচাই করা
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        file = request.files['file']

        # ফাইল চেক করা
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)  # ফাইলের নাম সুরক্ষিত করা
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return 'ফাইল সফলভাবে আপলোড করা হয়েছে'
        else:
            return 'অনুমোদিত ফাইল এক্সটেনশন নয়', 400

    return '''
    <form method="post" enctype="multipart/form-data">
      ফাইল নির্বাচন করুন: <input type="file" name="file">
      <input type="submit" value="Upload">
    </form>
    '''

if __name__ == "__main__":
    app.run(debug=True)

এখানে:

  • secure_filename(): এটি ফাইলের নাম সুরক্ষিত করে এবং বিশেষ অক্ষর সরিয়ে দেয়।
  • allowed_file(): এটি চেক করে যে ফাইলটির এক্সটেনশন অনুমোদিত ফাইল এক্সটেনশনের মধ্যে রয়েছে কিনা।
  • MAX_CONTENT_LENGTH: এটি ফাইল আপলোডের সর্বোচ্চ সাইজ সীমাবদ্ধ করে।

৩. Flask-এ File Security Management

ফাইল আপলোডের সময় নিরাপত্তার জন্য কিছু পদক্ষেপ নেওয়া জরুরি:

  1. ফাইলের সাইজ সীমাবদ্ধ করা: ম্যালিশিয়াস বা বড় ফাইল আপলোড থেকে রক্ষা পেতে ফাইলের সাইজ সীমাবদ্ধ করা উচিত।
  2. ফাইল এক্সটেনশন যাচাই করা: শুধুমাত্র নির্দিষ্ট এক্সটেনশন সমর্থন করা উচিত (যেমন .png, .jpg, .txt)।
  3. ফাইলের নাম সুরক্ষিত করা: ফাইলের নামের মধ্যে অক্ষরের ব্যবহার সীমিত করা উচিত, যেন কোনো স্ক্রিপ্ট ফাইল (যেমন .php, .exe) আপলোড না করা যায়।
  4. ফাইল ডিরেক্টরি পাথ সুরক্ষিত রাখা: আপলোড ফাইলগুলো আলাদা ফোল্ডারে রাখুন এবং ব্যবহারকারীদের ফাইল সিস্টেমের বাইরে অ্যাক্সেস সীমাবদ্ধ রাখুন।

৪. Flask-এ File Validation এবং Security Best Practices

  1. ফাইল এক্সটেনশন সঠিকভাবে যাচাই করুন: শুধুমাত্র নির্দিষ্ট এক্সটেনশন সমর্থন করুন, যেমন .png, .jpg, .jpeg, .gif, ইত্যাদি।
  2. ফাইল সাইজ সীমাবদ্ধ করুন: Flask-এ MAX_CONTENT_LENGTH ব্যবহার করে আপনি ফাইলের সর্বোচ্চ সাইজ সীমাবদ্ধ করতে পারেন, যাতে বড় সাইজের ফাইল সার্ভারে আপলোড না হয়।

    উদাহরণ:

    app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024  # 10 MB
    
  3. ফাইল নাম সুরক্ষিত করুন: ব্যবহারকারীরা যে ফাইলটি আপলোড করবেন, তার নাম সুরক্ষিত রাখতে secure_filename() ব্যবহার করা উচিত।

    উদাহরণ:

    filename = secure_filename(file.filename)
    
  4. ফাইল আপলোডের পরে স্ক্যানিং: আপনি ফাইল আপলোড করার পরে, বিশেষ করে যদি ব্যবহারকারীরা ম্যালিশিয়াস ফাইল আপলোড করতে পারে, তবে ফাইলটি স্ক্যান করা উচিত। আপনি ClamAV বা অন্য কোনো অ্যান্টিভাইরাস সফটওয়্যার ব্যবহার করে ফাইল স্ক্যান করতে পারেন।
  5. ফাইল আপলোডের পর কনটেন্ট টাইপ যাচাই করুন: ফাইলের MIME type যাচাই করে এটি নিরাপদ কি না তাও নিশ্চিত করতে পারেন।

    উদাহরণ:

    from werkzeug.utils import secure_filename
    import imghdr
    
    def allowed_file(filename):
        allowed_extensions = {'png', 'jpg', 'jpeg'}
        if '.' in filename and filename.rsplit('.', 1)[1].lower() in allowed_extensions:
            file_type = imghdr.what(filename)
            return file_type in allowed_extensions
        return False
    

৫. Flask-এ Secure File Upload Directory

ফাইল আপলোডের জন্য নিরাপদ ডিরেক্টরি তৈরি করা এবং অ্যাক্সেস কন্ট্রোল নিশ্চিত করা গুরুত্বপূর্ণ। অবশ্যই নিশ্চিত করতে হবে যে ফাইলগুলি সরাসরি সার্ভ করা না হয় (যেমন PHP স্ক্রিপ্ট বা JavaScript ফাইল)।

উদাহরণ: ফাইল আপলোডের নিরাপদ ডিরেক্টরি

import os

UPLOAD_FOLDER = 'uploads/'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

if not os.path.exists(UPLOAD_FOLDER):
    os.makedirs(UPLOAD_FOLDER)

এখানে:

  • UPLOAD_FOLDER: এটি আপলোড ফাইলগুলো যেখানে সেভ হবে তা নির্ধারণ করে।
  • os.makedirs(): ফোল্ডারটি যদি না থাকে তবে এটি তৈরি করবে।

Flask-এ File Validation এবং Security Management করার সময় অনেক ধরনের নিরাপত্তা ঝুঁকি মোকাবেলা করা হয়, যেমন ম্যালিশিয়াস ফাইল বা অতিরিক্ত বড় ফাইল। উপযুক্ত ফাইল ভ্যালিডেশন, সাইজ সীমাবদ্ধতা, এক্সটেনশন যাচাই এবং সুরক্ষিত ফাইল নাম ব্যবহার করে Flask অ্যাপ্লিকেশনগুলোকে আরও নিরাপদ করা যায়। এই পদ্ধতিগুলি আপনাকে ব্যবহারকারীর আপলোড করা ফাইলগুলির নিরাপত্তা নিশ্চিত করতে সাহায্য করবে, যা ওয়েব অ্যাপ্লিকেশনকে রক্ষা করতে সহায়ক।

Content added By

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 আক্রমণ প্রতিরোধ করা খুবই গুরুত্বপূর্ণ।

Content added By
Promotion

Are you sure to start over?

Loading...