نحوه ایجاد فایل ZIP با استفاده از جنگو

django create zip file
20 آبان 1403

در دنیای برنامه‌نویسی وب، نیاز به فشرده‌سازی و انتشار فایل‌ها به یک ضرورت تبدیل شده است. کتابخانه‌های زیادی برای این کار وجود دارد، اما جنگو به عنوان یک فریم‌ورک پرکاربرد در زبان پایتون، امکانات خاصی برای انجام این کار ارائه می‌دهد. ایجاد فایل ZIP می‌تواند به شما در انتشار و انتقال داده‌ها کمک کند، به خصوص زمانی که می‌خواهید مجموعه‌ای از فایل‌ها را به‌صورت فشرده به کاربران خود بدهید.

در این مقاله، به شما نشان خواهیم داد که چگونه با استفاده از امکانات داخلی جنگو و کتابخانه‌های پایتون، یک فایل ZIP ایجاد کنید. در ابتدا باید کتابخانه‌های مورد نیاز را ایمپورت کنیم و سپس روند ایجاد فایل زیپ را در چند مرحله ساده توضیح خواهیم داد.

ابتدا، باید بدانید که برای ایجاد فایل زیپ در جنگو، نیازی به افزودن ماژول جدید ندارید و می‌توانید مستقیماً از امکانات پایتون استفاده کنید. اغلب، استفاده از کتابخانه‌های built-in به شما کمک می‌کند تا کد خود را سبک‌تر و سریع‌تر بنویسید.

مکانیزم کار به این صورت است که شما ابتدا فایل‌های مورد نظر را آماده می‌کنید و سپس با استفاده از کتابخانه‌های داخلی، یک فایل ZIP ایجاد کرده و آن را برای دانلود توسط کاربر آماده می‌کنید. این روش به خصوص زمانی که تعداد زیادی فایل وجود دارد، بسیار مفید است.

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

from django.http import HttpResponse
from zipfile import ZipFile
import os

# Path to directory
file_dir = '/path/to/files/'

# Function to create zip

def create_zip(request):
    # Create a byte stream
    response = HttpResponse(content_type='application/zip')
    response['Content-Disposition'] = 'attachment; filename="files.zip"'

    # Create a zip using ZipFile
    with ZipFile(response, 'w') as zip_file:
        # Loop through each file and add to zip
        for filename in os.listdir(file_dir):
            zip_file.write(os.path.join(file_dir, filename), filename)

    return response

from django.http import HttpResponse <br> این خط از کد کتابخانه مورد نیاز جهت کار با HttpResponse را ایمپورت می‌کند. در واقع، این کتابخانه به ما اجازه می‌دهد نوعی از پاسخ را به کاربر ارسال کنیم.

from zipfile import ZipFile <br> این خط از کد ماژول ZipFile را ایمپورت می‌کند که برای کار با فایل‌های ZIP استفاده می‌شود. با استفاده از این ماژول، می‌توانیم فایل‌های مختلف را به یک فایل ZIP تبدیل کنیم.

import os <br> کتابخانه os به ما این امکان را می‌دهد تا به فایل‌ها و دایرکتوری‌ها دسترسی داشته باشیم و با آن‌ها کار کنیم. به صورت کلی، این کتابخانه برای عملکردهای سطح سیستم در پایتون استفاده می‌شود.

file_dir = '/path/to/files/' <br> با استفاده از این خط، مسیر دایرکتوری که حاوی فایل‌های مورد نظر برای فشرده‌سازی است، مشخص می‌شود. شما می‌توانید این مسیر را بر اساس نیاز خود تغییر دهید.

def create_zip(request): <br> با این خط یک تابع تعریف می‌شود که وظیفه ایجاد فایل ZIP را بر عهده دارد. تابع به یک پارامتر request نیاز دارد که اطلاعات مربوط به درخواست ارسال شده از سوی کاربر را در بر می‌گیرد.

response = HttpResponse(content_type='application/zip') <br> این خط یک HttpResponse را ایجاد می‌کند که نوع محتوا (content type) آن application/zip مشخص شده است تا مرورگر کاربر بداند که به دنبال یک فایل ZIP است.

response['Content-Disposition'] = 'attachment; filename="files.zip"' <br> در این خط، عنوان attachment تعیین می‌شود تا مرورگر قادر به دانلود فایل باشد و به صورت پیش‌فرض آن را باز نکند. همچنین نام فایل ZIP نیز مشخص می‌شود.

with ZipFile(response, 'w') as zip_file: <br> با استفاده از این خط، یک زیپ‌فایل جدید برای نوشتن ایجاد می‌شود و آن را درون متغیر zip_file ذخیره می‌کند.

for filename in os.listdir(file_dir): <br> این خط به ما اجازه می‌دهد تا به تک‌تک فایل‌های موجود در دایرکتوری مشخص شده دسترسی داشته باشیم و با آن‌ها کار کنیم.

zip_file.write(os.path.join(file_dir, filename), filename) <br> با استفاده از این خط، فایل‌ها به فایل ZIP اضافه می‌شوند. عنوان دوم filename نشان‌دهنده نام فایلی است که در زیپ قرار خواهد گرفت.

return response <br> تابع در نهایت یک پاسخ را که شامل فایل ZIP ایجاد شده است، به کاربر ارسال می‌کند.

سوالات متداول

؟

چرا از ZIP برای فشرده‌سازی فایل‌ها در جنگو استفاده می‌کنیم؟

؟

آیا برای ایجاد فایل ZIP به کتابخانه خارجی نیاز است؟

؟

چگونه نام فایل ZIP را در جنگو تغییر دهیم؟

؟

آیا می‌توان فرمت‌های دیگر فشرده‌سازی هم استفاده کرد؟

؟

چه نوع فایل‌هایی را می‌توان در یک ZIP ذخیره کرد؟