侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Laravel  /  管理员 发布于 4个月前   253

使用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;
        }
    }
}

  • 上一条:
    在go语言中字符串比较示例代码
    下一条:
    在laravel框架中如何有效的验证器验证数据流程步骤
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在laravel框架中的5个HTTP客户端技巧分享(0个评论)
    • 在laravel项目中实现密码强度验证功能推荐扩展包:password-strength(0个评论)
    • Laravel Response Classes 响应类使用优化浅析(0个评论)
    • 在Laravel中使用FilePond上传文件及测试用例(0个评论)
    • 在laravel项目中第三方回调信息处理扩展包:flaky(0个评论)
    • 近期文章
    • 在laravel框架中的5个HTTP客户端技巧分享(0个评论)
    • 在go语言中使用FFmpeg库实现PCM音频文件编码为mp3格式文件流程步骤(0个评论)
    • gopacket免安装Pcap实现驱动层流量抓包流程步骤(0个评论)
    • 在laravel项目中实现密码强度验证功能推荐扩展包:password-strength(0个评论)
    • 在go语言中用filepath.Match()函数以通配符模式匹配字符串示例(0个评论)
    • Laravel Response Classes 响应类使用优化浅析(0个评论)
    • mysql中sql_mode的各模式浅析(0个评论)
    • 百度文心一言今天发布,个人第一批内测体验记录,不好别打我(0个评论)
    • 嘿加密世界让我们谈谈在共识中将中本聪主流化(0个评论)
    • 在go语言中寻找两个切片或数组中的相同元素/共同点/交集并集示例代码(0个评论)
    • 近期评论
    • 博主 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 @ xiaoB 你只管努力,剩下的叫给天意;天若有情天亦老,..
    • xiaoB 在

      2023年国务院办公厅春节放假通知:1月21日起休7天中评论 会不会春节放假后又阳一次?..
    • BUG4 在

      你翻墙过吗?国内使用vpn翻墙可能会被网警抓,你需了解的事中评论 不是吧?..
    • 博主 在

      go语言+beego框架中获取get,post请求的所有参数中评论 @ t1  直接在router.go文件中配就ok..
    • Jade 在

      如何在MySQL查询中获得当月记录中评论 Dear zongscan.com team, We can skyroc..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客