后端
将一组文件打包成一个 Zip 压缩文件
//Zip 压缩文件
private static function zipFiles(array $filesPath, string $zipPath): ZipArchive
{
// 创建一个新的 ZipArchive 实例
$zip = new ZipArchive;
// 打开或创建一个 Zip 压缩文件,如果文件已存在则覆盖
if ($zip->open($zipPath, ZipArchive::CREATE | ZipArchive::OVERWRITE))
{
// 遍历传入的文件路径数组
foreach ($filesPath as $key => $filePaths)
{
// 如果当前文件路径数组为空,则跳过
if (empty($filePaths))
{
continue;
}
// 创建空文件夹
$zip->addEmptyDir('文件');
// 创建一个空的文件夹(目录)在压缩文件中
foreach ($filePaths as $filePath)
{
// 如果文件不存在,则跳过
if (!file_exists($filePath))
{
continue;
}
// 向压缩文件中添加当前文件,并将其放置在之前创建的文件夹内
$zip->addFile($filePath, $dirName . '/' . pathinfo($filePath)['basename']);
}
}
}
// 关闭 Zip 压缩文件
$zip->close();
// 返回 ZipArchive 实例
return $zip;
}
这个函数的主要目的是将一组文件打包成一个 Zip 压缩文件。它通过遍历文件路径数组 $filesPath,为每个文件创建一个空的文件夹,并将文件添加到该文件夹中,最后将所有文件和文件夹打包成一个 Zip 压缩文件。函数返回一个 ZipArchive 实例,您可以使用该实例来进一步操作压缩文件,如下载或存储到磁盘中。
创建一个 Zip 压缩文件,将特定的文件收集并添加到该压缩文件中
public static function getOrderFilesZip(int $orderId): string
{
//构建ZIP文件路径
$filePath = public_path() . DIRECTORY_SEPARATOR . 'pdfs' . DIRECTORY_SEPARATOR . $orderId.time() . '.zip';
// 检查并创建目录
$dirPath = public_path() . DIRECTORY_SEPARATOR . 'pdfs';
if (!is_dir($dirPath)) {
mkdir($dirPath, 0777, true);
}
// 收集订单文件
$orderFile = OrderFile::with('file')->where('order_id', $orderId)->get();
// 筛选有效文件
$files = $orderFile->map(function ($order) {
return $order->file ? public_path($order->barcode->file) : null;
})->filter()->toArray();
$files = [
'file' => $file,
];
// 检查是否有要下载的数据
throw_if_error(empty($files['file']) ), '没有要下载的数据!');
self::zipFiles($files, $filePath);
return $filePath;
}
这段代码的主要目的是在 Laravel 应用程序中创建一个 Zip 压缩文件,将特定的文件收集并添加到该压缩文件中。
下载接口
public function download(Request $request)
{
$orderId = $request->id ;
// 如果ID为null,则抛出异常,认为参数不合法
throw_if_fail(is_null($orderId), '参数不合法');
try {
// 调用 OrderRepo 类的 getOrderFilesZip 方法,获取生成的 ZIP 文件路径
$zipFile = OrderRepo::getOrderFilesZip($orderId);
// 设置响应的内容类型为 ZIP 文件
header('Content-Type: application/zip');
// 设置响应头,提示浏览器下载文件,文件名为 ZIP 文件的基本名称
header('Content-Disposition: attachment; filename="' . basename($zipFile) . '"');
// 设置响应头,指定文件的长度
header('Content-Length: ' . filesize($zipFile));
// 将 ZIP 文件内容输出给客户端
readfile($zipFile);
// 下载完成后,删除生成的 ZIP 文件,释放服务器空间
unlink($zipFile);
} catch (\Exception $e) {
// 捕获异常并返回错误响应
return response_error($e->getMessage());
}
}
这段代码适用于在 Laravel 中实现文件下载功能,特别是在需要将多个文件打包成 ZIP 文件并提供下载的情况下非常有用。
前端
下载按钮
<a href="{{ admin_route('orders.download', [$order->id]) }}"class="btn btn-outline-secondary btn-sm " >
下载压缩包
</a>