Laravel 11 中创建 ZIP 存档文件
在这篇文章中,学习如在 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
目录。
请登录后再评论