علی اکبری
1 ماه پیش توسط علی اکبری مطرح شد
3 پاسخ

دانلود چند فایل همزمان در لاراول

سلام
در لاراول چجوری میشه چند فایل رو همزمان با هم دانلود کرد.
مثلا 10 فایل آپلود شده است و همچنین در دیتا بیس هم مسیر فایل ها ذخیره شده است . الان نیاز دارم که یکجا این 10 فایل رو باهم دانلود کنم . حالا تک تک دانلود شوند یا یکجا یا در قالب یک فایل zip دانلود شوند.


ثبت پرسش جدید
رضا پارسیان
تخصص : توسعه دهنده Php , Laravel
@Rp76 3 هفته پیش آپدیت شد
0

سلام
اگر فایل ها رو به صورت فیزیکی دارید

میتونید

<?php
$sourcePath = '/path/to/your/file.txt';   // مسیر فایل منبع
$localName  = 'folder_in_zip/file.txt';   // نامی که در داخل ZIP خواهد بود

if ($zip->addFile($sourcePath, $localName)) {
    echo "Added {$sourcePath} as {$localName}.<br>";
} else {
    echo "Failed to add {$sourcePath}.<br>";
}
?>

فکر می‌کنم مشکلتون رو حل کنه فقط یادتون باشه که باید پلاگین zip رو باید نصب کنید

اگر لینوکس دارید

sudo apt install php8.4-zip

علی اکبری
تخصص : بک اند
@jpro.feri 3 هفته پیش مطرح شد
0

ممنون از پاسخگویی

گشتم یه پکیج spatie/laravel-zipstream پیدا کردم .

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

ابتدا پکیج spatie/laravel-zipstream را با Composer نصب کنید:

composer require spatie/laravel-zipstream

مرحله ۲: ایجاد یک کنترلر برای ایجاد فایل ZIP

یک کنترلر جدید ایجاد کنید (مثلاً FileController) و متدی برای ایجاد و دانلود فایل ZIP در آن قرار دهید:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use Spatie\LaravelZipStream\ZipStream;

class FileController extends Controller
{
    public function downloadAllFiles()
    {
        // مسیر دایرکتوری که فایل‌های آپلود شده در آن ذخیره می‌شوند
        $uploadDirectory = 'uploads'; // این مسیر را با مسیر واقعی خودتان جایگزین کنید

        // گرفتن لیست تمام فایل‌ها در دایرکتوری مشخص شده
        $files = Storage::files($uploadDirectory);

        // اگر فایلی پیدا نشد
        if (empty($files)) {
            return response('هیچ فایلی برای دانلود یافت نشد.', 404);
        }

        // ایجاد جریان ZIP
        return ZipStream::create('all_uploaded_files.zip', function ($zip) use ($files, $uploadDirectory) {
            foreach ($files as $file) {
                // گرفتن نام فایل بدون مسیر
                $fileName = basename($file);
                // اضافه کردن فایل به جریان ZIP
                // مسیر کامل فایل در سرور را مشخص کنید
                $zip->addFile($fileName, Storage::path($file));
            }
        });
    }
}

توضیحات کد:
$uploadDirectory: مسیری را که فایل‌های آپلود شده در آن ذخیره می‌شوند مشخص می‌کند. مطمئن شوید این مسیر صحیح باشد.
Storage::files($uploadDirectory): لیستی از تمام فایل‌های موجود در دایرکتوری مشخص شده را برمی‌گرداند.
ZipStream::create(): یک فایل ZIP جدید ایجاد می‌کند. نام فایل (all_uploaded_files.zip) و یک تابع callback که فایل‌ها را به ZIP اضافه می‌کند، به آن پاس داده می‌شود.
$zip->addFile(): هر فایل را به ZIP اضافه می‌کند. آرگومان اول نام فایل در ZIP و آرگومان دوم مسیر کامل فایل در سیستم فایل سرور است. Storage::path() مسیر کامل فایل را برمی‌گرداند.

مرحله ۳: تعریف یک روت (Route)

یک روت در فایل routes/web.php برای دسترسی به متد دانلود تعریف کنید:

use App\Http\Controllers\FileController;

Route::get('/download-all-files', [FileController::class, 'downloadAllFiles'])->name('download.all.files');

مرحله ۴: ایجاد دکمه دانلود در Blade View

حالا می‌توانید در فایل Blade خود (مثلاً welcome.blade.php یا هر فایل دیگری که نمایش می‌دهید) یک دکمه یا لینک ایجاد کنید که کاربر با کلیک روی آن، فایل ZIP دانلود شود:

<a href="{{ route('download.all.files') }}" class="btn btn-primary">دانلود همه فایل ها</a>

علی اکبری
تخصص : بک اند
@jpro.feri 3 هفته پیش آپدیت شد
0

نکات مهم:

مسیر فایل‌ها: مطمئن شوید که $uploadDirectory در کنترلر به درستی به مسیری اشاره می‌کند که لاراول فایل‌های آپلود شده را در آن ذخیره می‌کند. به طور پیش‌فرض، لاراول فایل‌ها را در storage/app ذخیره می‌کند، بنابراین مسیر شما ممکن است چیزی شبیه به storage/app/uploads باشد. اگر از Storage::disk('public')->putFile(...) استفاده کرده‌اید، مسیر فایل‌ها در storage/app/public خواهد بود. در این صورت باید از Storage::disk('public')->path($file) استفاده کنید.
مجوزها: مطمئن شوید که وب سرور شما (Nginx یا Apache) مجوز خواندن فایل‌ها در دایرکتوری آپلود شده را دارد.
فایل‌های بزرگ: اگر تعداد فایل‌ها یا حجم آن‌ها بسیار زیاد است، ممکن است با محدودیت زمان اجرای PHP یا حافظه مواجه شوید. در این صورت، ممکن است نیاز به پیکربندی مجدد سرور یا استفاده از راه‌حل‌های پیشرفته‌تر (مانند صف‌بندی یا دانلود تک‌تک فایل‌ها به صورت ناهمزمان) باشد.
پکیج‌های جایگزین: پکیج‌های دیگری نیز برای کار با فایل‌های ZIP در لاراول وجود دارند، اما spatie/laravel-zipstream برای ایجاد فایل‌های ZIP پویا و با جریان بالا (stream) بسیار کارآمد است.

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام