آپلود فایل در فرم‌ها با پایتون و Flask

آپلود فایل در فرم‌ها با پایتون و Flask

در توسعه وب، یکی از قابلیت‌های اساسی، امکان آپلود فایل توسط کاربران است. این قابلیت در بسیاری از برنامه‌ها مانند شبکه‌های اجتماعی، سیستم‌های مدیریت محتوا و فروشگاه‌های آنلاین کاربرد دارد. در این مقاله، به بررسی نحوه پیاده‌سازی آپلود فایل در فرم‌های وب با استفاده از پایتون و فریم‌ورک Flask خواهیم پرداخت. این آموزش برای توسعه‌دهندگان وب با پایتون در سطح متوسط مناسب است.

پیش‌نیازها

قبل از شروع، اطمینان حاصل کنید که موارد زیر را دارید:

  • پایتون نصب شده باشد (نسخه 3.6 یا بالاتر توصیه می‌شود).
  • Flask نصب شده باشد. می‌توانید آن را با استفاده از pip نصب کنید: pip install Flask
  • یک ویرایشگر کد (مانند VS Code، PyCharm یا Sublime Text).

ساختار پروژه

برای شروع، یک ساختار پروژه ساده ایجاد می‌کنیم:

my_project/
├── app.py
├── templates/
│   └── upload.html

فایل app.py حاوی کد پایتون Flask است و فایل upload.html قالب HTML فرم آپلود فایل را تعریف می‌کند.

ایجاد فرم آپلود فایل (upload.html)

ابتدا، فایل upload.html را ایجاد کنید. این فایل شامل یک فرم HTML با یک فیلد برای انتخاب فایل و یک دکمه ارسال است:

<!DOCTYPE html>
<html lang="fa">
<head>
    <meta charset="UTF-8">
    <title>آپلود فایل</title>
</head>
<body>
    <form action="/upload" method="post" enctype="multipart/form-data">
        <input type="file" name="file">
        <button type="submit">آپلود</button>
    </form>
</body>
</html>

نکات مهم در این فرم:

  • method="post": فرم با استفاده از متد POST ارسال می‌شود.
  • enctype="multipart/form-data": این ویژگی ضروری است زیرا به مرورگر می‌گوید که فرم شامل فایل است و باید به صورت چندبخشی (multipart) ارسال شود.
  • name="file": نام فیلد آپلود فایل باید با نامی که در کد پایتون برای دسترسی به فایل استفاده می‌کنید، مطابقت داشته باشد.

کد پایتون Flask (app.py)

حالا، فایل app.py را ایجاد کنید و کد پایتون Flask را برای مدیریت آپلود فایل بنویسید:

from flask import Flask, render_template, request
import os

app = Flask(__name__)

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

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

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

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return 'هیچ فایلی انتخاب نشده است.'

    file = request.files['file']

    if file.filename == '':
        return 'نام فایل معتبر نیست.'

    if file:
        filename = file.filename
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return 'فایل با موفقیت آپلود شد.'

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

توضیح کد:

  • UPLOAD_FOLDER: این متغیر، مسیر پوشه‌ای را که فایل‌های آپلود شده در آن ذخیره می‌شوند، مشخص می‌کند.
  • app.config['UPLOAD_FOLDER']: این خط، مسیر پوشه آپلود را در تنظیمات Flask تنظیم می‌کند.
  • os.makedirs(UPLOAD_FOLDER): این خط، پوشه آپلود را ایجاد می‌کند اگر وجود نداشته باشد.
  • @app.route('/'): این دکوراتور، مسیر اصلی برنامه را تعریف می‌کند که فرم آپلود فایل را نمایش می‌دهد.
  • @app.route('/upload', methods=['POST']): این دکوراتور، مسیر `/upload` را تعریف می‌کند که با متد POST قابل دسترسی است و فایل آپلود شده را پردازش می‌کند.
  • request.files['file']: این خط، فایل آپلود شده را از درخواست POST دریافت می‌کند.
  • file.filename: این خط، نام فایل آپلود شده را دریافت می‌کند.
  • file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)): این خط، فایل آپلود شده را در پوشه آپلود ذخیره می‌کند.

اجرای برنامه

برای اجرای برنامه، فایل app.py را با استفاده از پایتون اجرا کنید:

python app.py

سپس، مرورگر خود را باز کنید و به آدرس http://127.0.0.1:5000/ بروید. فرم آپلود فایل را مشاهده خواهید کرد. یک فایل را انتخاب کنید و دکمه “آپلود” را کلیک کنید. اگر همه چیز به درستی کار کند، پیام “فایل با موفقیت آپلود شد.” را مشاهده خواهید کرد و فایل در پوشه uploads ذخیره می‌شود.

امنیت

آپلود فایل می‌تواند خطرات امنیتی ایجاد کند. برای جلوگیری از این خطرات، باید اقدامات امنیتی زیر را در نظر بگیرید:

  • اعتبارسنجی نوع فایل: قبل از ذخیره فایل، نوع آن را بررسی کنید تا مطمئن شوید که فقط فایل‌های مجاز آپلود می‌شوند.
  • محدودیت اندازه فایل: اندازه فایل آپلود شده را محدود کنید تا از مصرف بیش از حد فضای ذخیره‌سازی و حملات DoS جلوگیری شود.
  • تغییر نام فایل: نام فایل آپلود شده را تغییر دهید تا از اجرای فایل‌های مخرب جلوگیری شود.
  • ذخیره فایل در خارج از پوشه وب: فایل‌های آپلود شده را در پوشه‌ای خارج از پوشه وب ذخیره کنید تا از دسترسی مستقیم به آنها جلوگیری شود.

اعتبارسنجی نوع فایل

برای اعتبارسنجی نوع فایل، می‌توانید از پسوند فایل استفاده کنید. با این حال، این روش قابل اعتماد نیست زیرا کاربران می‌توانند پسوند فایل را تغییر دهند. روش مطمئن‌تر، بررسی محتوای فایل است. برای این کار، می‌توانید از کتابخانه‌هایی مانند python-magic استفاده کنید.

محدودیت اندازه فایل

برای محدودیت اندازه فایل، می‌توانید از تنظیمات Flask استفاده کنید:

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

این خط، حداکثر اندازه فایل آپلود شده را به 16 مگابایت محدود می‌کند.

تغییر نام فایل

برای تغییر نام فایل، می‌توانید از کتابخانه uuid استفاده کنید:

import uuid

filename = str(uuid.uuid4()) + '.' + file.filename.split('.')[-1]
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

این کد، یک نام فایل تصادفی ایجاد می‌کند و پسوند اصلی فایل را به آن اضافه می‌کند.

ذخیره فایل در خارج از پوشه وب

برای ذخیره فایل در خارج از پوشه وب، می‌توانید از یک مسیر مطلق استفاده کنید که خارج از پوشه وب قرار دارد. به عنوان مثال:

UPLOAD_FOLDER = '/var/www/uploads'

این خط، فایل‌ها را در پوشه `/var/www/uploads` ذخیره می‌کند که خارج از پوشه وب است.

نتیجه‌گیری

در این مقاله، نحوه پیاده‌سازی آپلود فایل در فرم‌های وب با استفاده از پایتون و Flask را بررسی کردیم. با رعایت نکات امنیتی، می‌توانید یک سیستم آپلود فایل امن و قابل اعتماد ایجاد کنید. این آموزش، پایه و اساسی برای توسعه برنامه‌های وب با قابلیت آپلود فایل است و با کمی تغییر و توسعه، می‌توانید آن را برای نیازهای خاص خود سفارشی‌سازی کنید.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *