在laravel项目中把七牛云空间的大量文件压缩打包下载流程步骤

2023-06-01 00:00:00 步骤 中把 打包下载

使用laravel框架项目从七牛云空间中使用多文件压缩(mkzip)打包下载大量文件简单教程

多文件压缩(mkzip):

多文件压缩,为用户提供了批量文件的压缩存储功能。

用户通过指定一系列 URL,即可将若干七牛空间中的资源文件,在七牛服务端压缩后存储。

若用户同时指定了saveas,则将生成的压缩文件以用户指定的 key 存储到指定的 bucket 中,

若未指定 saveas,则以压缩文件的 hash 值作为 key 并存储到当前 bucket 中。


大量文件压缩 (mode=4):

为了将大量文件压缩,可以将待压缩文件URL写入一个索引文件,上传至bucket,再对该索引文件进行的mkzip操作.


进入步骤:


1.composer安装七牛云扩展包

composer require itbdw/laravel-storage-qiniu


2.简单示例

<?php
namespace App\Http\Controllers\Common;
use Qiniu\Auth;
use zgldh\QiniuStorage\QiniuStorage;
use Qiniu\Processing\PersistentFop;
use Illuminate\Support\Str;
use function Qiniu\base64_urlSafeEncode;
use function Qiniu\entry;
class QiniuCompressionController
{
    private string $accessKey;
    private string $secretKey;
    private string $bucket;
    private string $pipeline;
    private string $domain;
    public function __construct()
    {
        $this->accessKey = env('accessKey');
        $this->secretKey = env('secretKey');
        $this->bucket    = env('bucket');
        $this->pipeline  = env('pipeline'); //智能多媒体服务队列
        $this->domain    = env('domain'); //七牛云配置域名
    }
    public function multiFileCompression(array $source_array, string $package_name, string $callback_url = null)
    {
        //初始化
        $auth = new Auth($this->accessKey, $this->secretKey);
        $disk = QiniuStorage::disk('qiniu');
        $file_name = md5(time() . Str::random(6)).'.txt'; // 文件名
        foreach ($source_array as $source) {
            $str = '';
            $Base64EncodedURL = base64_urlSafeEncode($source['key']);
            $Base64AliasEncodedURL = base64_urlSafeEncode($source['alias']);
            $str .= '/url/'.$Base64EncodedURL;
            if(!empty($source['alias'])){
                $str .= '/alias/'.$Base64AliasEncodedURL;
            }
            // 将数据保存到本地文件中
            file_put_contents($file_name, $str.PHP_EOL, FILE_APPEND);
        }
        $file_content = file_get_contents($file_name);
        $dir = 'zips'; // 保存到指定七牛云空间的文件夹路径(按照自己的空间路径设置即可)
        $key = $dir . '/' . $file_name; // 文件路径
        $bool = $disk->put($key,$file_content); //上传该文件到七牛云
        // 判断是否上传成功
        if ($bool) {
            $fops = 'mkzip/4/|saveas/'.entry($this->bucket,$dir . '/' . $package_name);
            $pfop = new PersistentFop($auth, null);
            // 压缩打包文件 【参数 pipeline 非必填,但还是建议去配置一个https://portal.qiniu.com/dora/media-gate/pipeline】
            list($id, $err)  = $pfop->execute($this->bucket,$key,$fops,$this->pipeline,$callback_url,false);
            if(is_null($err)){
                //轮询队列执行完成后才返回
                while(true){
                    $url = "https://api.qiniu.com/status/get/prefop?id=" . $id;
                    $json = file_get_contents($url);
                    $arr = json_decode($json, true);
                    if($arr['code'] == 0 ){
                        break;
                    }else if($arr['code'] == 3 || $arr['code'] == 4){
                        return ['code'=>500,'msg'=>'操作失败'];
                    }
                }
                //移除本地临时文件
                unlink($file_name);
                //移除七牛云临时文件
                $disk->delete($key);
                return [
                    'code'=>200,
                    'download_url' => 'https://' . $this->domain . '/' . $dir . '/' . $package_name, //下载地址
                ];
            }else{
                return ['code'=>500,'msg'=>'操作失败'];
            }
            exit;
        } else{
            return ['code'=>500,'msg'=>'操作失败'];
        }
    }
   
    //调用使用
    public function do()
    {
        //简单示例
        $source_array = [
            [
                'key' => 'http://xxxxxxxxxxxxxxx.jpg',  // 七牛云文件路径
                'alias' => 'a.jpg',                     // 设置别名(也可以不设置)
            ],[
                'key' => 'http://yyyyyyyyyyyyyyy.jpg',
                'alias' => 'b.jpg',
            ],
        ];
        //压缩包名
        $package_name = date('YmdHis') . '-' .Str::random(6) . '.zip';
        $data = $this->multiFileCompression($source_array,$package_name);
        //触发网页下载
        if($data['code'] == 200){
            $response = response()->streamDownload(function () use($data){
                echo file_get_contents($data['download_url']);
            },$package_name,[
                'Content-Type: application/octet-stream',
                'Content-Disposition: attachment; filename="'.$package_name.'"',
                'Content-Transfer-Encoding: binary'
            ]);
            return $response;
        }
    }
}

相关文章