laravel9在 BeikeShop 框架实现下载压缩包功能

106 阅读1分钟

后端

将一组文件打包成一个 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>