Laravel 11 中创建 ZIP 存档文件

作者: 温新

图书: 【Laravel 11 实战】

阅读: 69

时间: 2025-01-18 05:13:26

在这篇文章中,学习如在 Laravel 11 中把文件打包成 zip 并下载。

ZIP 文件是一种常用的压缩归档格式,用于整理和压缩大量数据。它是减少大文件或文件夹大小以实现更高效存储和分享的流行方式。ZIP 文件通过将一个或多个文件或文件夹压缩成单个归档文件来工作,在保持其结构和内容完整的同时减小了它们的体积。这使得文件更容易传输或存储,因为它们占用的空间更少,并且可以更方便地通过互联网下载或分享。

事实上,这与 Laravel 无关,而与 PHP 无关,我们将使用自 PHP 5.2 以来就存在的 ZipArchive 类。要使用它,请确保您的 php.ini 已启用名为 ext-zip 的扩展。

第一步:添加路由

routes/web.php

<?php

use App\Http\Controllers\ZipController;
use Illuminate\Support\Facades\Route;

Route::get('download-zip', [ZipController::class, 'downloadZip']);

第二步:创建控制器并编写打包 zip 方法

创建控制器

$ php artisan make:controller ZipController

编写方法:app/Http/Controllers/ZipController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\File;
use Symfony\Component\HttpFoundation\BinaryFileResponse;

class ZipController extends Controller
{
    /**
     * 下载一个包含指定目录下所有文件的ZIP文件。
     *
     * 此方法将创建一个新的 ZIP 文件,其中包含位于 public/test 目录下的所有文件,
     * 然后提供该 ZIP 文件以供下载。如果成功创建并下载了 ZIP 文件,则返回下载响应;
     * 如果 ZIP 文件创建失败,则可能需要额外处理错误情况。
     *
     * @return BinaryFileResponse
     */
    public function downloadZip(): BinaryFileResponse
    {
        // 创建一个新的 ZipArchive 实例
        $zip      = new \ZipArchive();
        // 定义 ZIP 文件名和完整路径
        $fileName = 'myNewFile.zip';

        // 尝试打开或创建 ZIP 文件
        if ($zip->open(public_path($fileName), \ZipArchive::CREATE) === TRUE) {
            // 获取 public/test 目录下的所有文件列表
            $files = File::files(public_path('test'));
            // 遍历文件列表,并将每个文件添加到 ZIP 文件中
            foreach ($files as $key => $value) {
                // 使用 basename() 函数获取文件的相对名称(不包括路径)
                $relativeNameInZipFile = basename($value);
                // 将文件添加到 ZIP 归档中
                $zip->addFile($value, $relativeNameInZipFile);
            }

            $zip->close();
        }

        // 返回 HTTP 响应,强制浏览器下载 ZIP 文件。
        // 注意:此代码没有处理下载后的清理工作(如删除临时 ZIP 文件)。
        // 可能需要根据实际情况添加这样的功能。
        return response()->download(public_path($fileName));
    }
}

注意:我在 public 目录下创建了 test 目录。

请登录后再评论