PHP多文件分片压缩下载实现的详细介绍(二)

简介: 在上一篇博客中写了一个先压缩后分片下载的demo,但是存在一定的缺点,本篇介绍的是先分片然后放入压缩包最后再分片下载

一、写在开始

在上一篇博客中写了一个先压缩后分片下载的demo,但是存在一定的缺点,本篇介绍的是先分片然后放入压缩包最后再分片下载

二、具体代码

    public function downloads()
    {
        $id = input();
        $row = db('files')->where('id', $id['ids'])->find();
        $datas = db('files')->where('uid', $row['uid'])->select();
        $arr = [];
        foreach ($datas as $key => $value) {
            array_push($arr, $value['path']);
        }
        // 创建一个目录
        $path = "./uploads/zip/" . date('Y-m-d');
        if (!file_exists($path)) {
            mkdir(iconv("UTF-8", "GBK", $path), 0777, true);
        }
        // 创建一个压缩包
        $zip = new \ZipArchive();
        $zip_name = $path . '/' . date('H-i-s') . '.zip'; //压缩包路径
        if ($zip->open($zip_name, \ZipArchive::CREATE) !== true) {
            exit("压缩包文件创建失败!");
        }
        $chunk_size = 1024 * 1024; // 分片大小,这里设置为1MB
        foreach ($arr as $file) {
            $path_url = '.' . $file; //获取到的文件路径是从/uploads开始的
            $handle = fopen($path_url, 'rb'); //打开该文件
            if ($handle === false) {
                exit('打开文件失败');
            }
            // fseek($handle , 0);
            // 分片读取文件
            while (!feof($handle)) {
                $test = fread($handle, $chunk_size);
                if ($test === false) {
                    exit('读取失败');
                }
                $zip->addFile($path_url, basename($path_url)); //向压缩包中添加文件
                // flush();
                // ob_flush();
            }
            fclose($handle); //关闭文件
        }
        $zip->close(); //关闭压缩包
        // var_dump($zip_name);exit;
        header('Content-Type: application/zip');
        header('Content-Disposition: attachment; filename="' . 'ya.zip"');
        header('Accept-Ranges: bytes');
        header('Content-Length:'. filesize($zip_name));
        // readfile($zip_name);
        $length = filesize($zip_name);
        try {
            // 打开文件,并获取文件大小
            $fp = fopen($zip_name, 'rb');
            if ($fp === false)  exit("文件打开失败");
            // 直接输出文件内容到浏览器
            while (!feof($fp)) {
                echo fread($fp, 8192);
            }
        } finally {
            // 关闭文件
            if ($fp !== false) fclose($fp);
            // 删除临时目录和文件
            // array_map('unlink', glob($temp_dir . '/*'));
            // rmdir($temp_dir);
            exit;
        }
    }


目录
相关文章
|
2月前
|
PHP
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
本文介绍了解决PHP常见问题的步骤,包括定位和创建`php.ini`文件,以及解决`mb_strlen()`函数未定义和DLL模块加载错误的具体方法。
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
前端开发 PHP
php学习笔记-php文件表单上传-day06
本文介绍了PHP文件上传处理流程、预定义变量`$_FILES`的使用、文件上传状态代码以及文件上传实现函数。同时,通过一个文件上传的小例子,演示了文件上传表单的创建、文件上传表单处理的PHP页面编写以及运行测试输出。
php学习笔记-php文件表单上传-day06
|
2月前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
|
2月前
进入靶场,出现一张照片,右击查看源代码,发现有一个注释的source.php文件
这段代码实现了一个网站上弹出的促销海报动画效果,包含一个关闭按钮。当促销海报弹出时,会在三秒后开始抖动一两下。海报使用固定定位居中显示,带有阴影和圆角,关闭按钮位于右上角。可以通过修改时间参数调整弹出时间。
20 0
|
3月前
|
存储 安全 数据库连接
php.ini 文件的用途是什么?
【8月更文挑战第29天】
71 1
|
3月前
|
PHP
PHP遍历文件并同步上传到服务器
在进行网站迁移时,由于原网站的图片文件过多,采用打包下载再上传的方式耗时过长,且尝试使用FTP工具从旧服务器传输至新服务器时失败。为解决此问题,特使用PHP编写了一款工具,该工具能扫描指定目录下的所有`.webp`图像文件,并将其上传至新的服务器,极大地提高了迁移效率。
103 16
|
3月前
|
Java 应用服务中间件 PHP
PHP——调用java文件中的方法
PHP——调用java文件中的方法
56 0
PHP——调用java文件中的方法
|
4月前
|
API PHP UED
​一个PHP文件实现联系表单自动发送邮件
使用PHP和AOKSend服务,可以创建一个联系表单,收集用户信息并自动发送邮件。HTML表单包含姓名、邮箱和消息字段。PHP文件`send_mail.php`处理表单提交,通过AOKSend的SMTP设置(如主机、端口、API密钥)使用PHPMailer发送邮件到指定地址。代码中还包括安全措施,如使用`htmlspecialchars`防止XSS攻击。这种方法增强了网站的用户沟通体验,并依赖AOKSend的稳定性和API进行高效邮件发送。
|
3月前
|
PHP
php怎么循环读取文件夹里的文件
`DirectoryIterator`类提供了一个接口来遍历文件系统目录。与 `glob`函数相比,使用 `DirectoryIterator`类可以获得更多文件属性信息,如文件大小、修改时间等,从而进行更复杂的文件处理操作。
39 0