美文网首页
php压缩多个文件打包成zip并下载到本地

php压缩多个文件打包成zip并下载到本地

作者: __ee47 | 来源:发表于2018-01-03 16:01 被阅读0次

    完成时间:2018-01-03

    展现方式:整个相册图片的导出(下载到本地)直接在页面上生成下载没有什么另存为什么默认路径

    基本步骤:

    1.用户点击按钮跳转到对应相册导出的方法

    ---->2.在方法中通过页面的相册id号进行数据库查找对应相册的每个图片路径

    ---->3.记录保存到数组中

    ---->4.后续把图片打包进压缩文件直接把数组的路径键读取压缩进即可.

    遇到的坑:

    A.如何解决在服务器生成一次压缩包.zip文件之后每次通过文件名查找文件是否存在存在就返回文件.

    1.尝试用相册id号查找相册名,以相册名.zip为生成的文件名.在有中文字符的前提,生成的压缩文件会出错(格式之类的问题).在网上查找解决方案如下:用(纯英文不算)iconv("utf-8","gb2312",$path );

    照样出错,不存在编码什么的转换一下就ok的问题,当然我放弃了他. X

    2.利用时间戳来生成文件名(时间不含有中文,只有数字,而且唯一性可判断),仔细想想你每次都会根据当前时间生成一个新的文件.所以我就想解决办法,可否通过生成一个静态变量或者静态数组第一次生成该相册的压缩包时把该相册的id为数组键,第一次的文件名为键值.形式如下$s1[$相册id]=$filename;//$filename=第一次生成的压缩包文件名.之后每次执行导出相册的时候则通过判断是否存在这个相册id的$filename来进行.如果存在这个相册键值则返回这个文件名为导出相册.当然我没有尝试这个静态数组的方式去写,因为我不明确怎么去声明,在哪里声明这个静态变量.这个方法交给有心人去尝试了.我还想到了一种需要数据库的操作,就是你可以在对应的相册上加一个字段为打包相册的文件名当然不能含有中文,你可以每次导出的时候查询这个字段就可以了. :) 

    A.√解决办法:

    通过对应的相册id查到唯一的相册名(所有类型的字符中文,数字等都可以)保存下来通过md5转换他这样他就是不含有中文的文件名并且唯一:)

    形式如下:$s1=md5($s1);

    B.再说一个小坑:当你都没有问题后你下载打包的压缩文件时你会发现你的zip有时候下载的文件大小为0字节,:D就根本没下下来好嘛!但是你会发现小的压缩文件还是可以下下来的比如十几二十MB的,这里就是要设置php配置文件了。

    B.√解决办法:php.ini:memory_limit 主要是解决readfile() 函数进行的文件下载大小设置。

    memory_limit = XXXM (1024M 512M)等等看你喜欢

    接下来上代码:

    /** 导出相册*/

    $extra->append(array(

            '<  a class="btn btn_primary add upload-image"  target="_blank" href="?m=photo&a=exportAlbum&albumid='.$albumId.'" style="color:white;position: relative"> 导出相册< /a  >',

    ));//$albumId=代表对应相册id,a=exportAlbum跳转导出相册这个方法

    public static function exportAlbum(){

        error_reporting(E_ALL^E_NOTICE);

        $albumId = Safe::number(request('albumid'), '相册ID', false);

        $rs = System::$pdo->prepare("SELECT `img` FROM `photo` WHERE `albumid`=$albumId");

        $rs->execute();

        $data = $rs->fetchAll(PDO::FETCH_ASSOC);

        $rs1 = System::$pdo->prepare("SELECT `name` FROM `album` WHERE `id`=$albumId");

        $rs1->execute();

        $data1 = $rs1->fetchAll(PDO::FETCH_ASSOC);

        $s1=$data1[0][name];

        $s1=md5($s1);

        $filename ="$s1.zip"; //最终生成的文件名(含路径)

        if(!file_exists($filename) ){

            $zip = new ZipArchive();

            if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {

                exit('无法打开文件,或者文件创建失败');

    }

            foreach( $data as $key=>$val){

                if(file_exists($val[img])){

                  $zip->addFile( $val[img], basename($val[img]));

                }

    }

            $zip->close();//关闭

        }

        if(!file_exists($filename)){

                exit("无法找到文件");

    }

        header("Cache-Control: public");

        header("Content-Description: File Transfer");

        header('Content-disposition: attachment; filename='.basename($filename)); //文件名

        header("Content-Type: application/zip"); //zip格式的

        header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件

        header('Content-Length: '.filesize($filename)); //告诉浏览器,文件大小

        @readfile($filename);

        exit;

    }

    相关文章

      网友评论

          本文标题:php压缩多个文件打包成zip并下载到本地

          本文链接:https://www.haomeiwen.com/subject/efvhnxtx.html