PHP Zip压缩导出图片

1.需求,根据url导出图片

2.思路

  准备好图片地址,想要保存的文件名称,在一个数组中

  启动打开zip文件

  下载文件添加到zip中

  下载zip到本地

3.实现代码

 1 <?php
 2     // 开始时间
 3     $stime=microtime(true);
 4     // 数据
 5     $data="'Test04255','Test04254','Test04253','Test04252','Test04251','Test04250'";
 6     //$data=file_get_contents(dirname(__FILE__).'/kuhao.txt');
 7     //连接数据库
 8     $pdo = new PDO("mysql:host=127.0.0.1;dbname=dbname","root","root");
 9     $sql="SELECT `image`,`library_number`,`carousel_image`,`detail` FROM `art_info` WHERE `library_number` IN ({$data})";
10     $cx=$pdo ->query($sql,$pdo::FETCH_ASSOC);
11     $list=$cx->fetchAll($pdo::FETCH_ASSOC);
12     //文件路径
13     $tmpDir = $_SERVER['DOCUMENT_ROOT'].'\\'.'downimg\\';
14     if (!file_exists($tmpDir)) {
15         //创建文件夹
16         mkdir($tmpDir, 0777, true);
17     }
18     // 定义文件信息
19     $zipName='tupian.zip';
20     // 实例化zip类
21     $zip = new \ZipArchive();
22     $zipNameUrl = $tmpDir . $zipName;
23     if ($zip->open($zipNameUrl, \ZipArchive::OVERWRITE) !== true) {
24         //OVERWRITE 参数会覆写压缩包的文件 文件必须已经存在
25         if ($zip->open($zipNameUrl, \ZipArchive::CREATE) !== true) {
26             // 文件不存在则生成一个新的文件 用CREATE打开文件会追加内容至zip
27             return  '下载失败,文件夹不存在';
28         }
29     }
30     // 循环保存图片信息
31     foreach ($list as $lis){
32         // 第一个默认的图
33         $picAllArr[] = ['fileurl'=>$lis['image'],'filename'=>$tmpDir.$lis['library_number'].'\image.'.pathinfo($lis['image'])['extension'],'dirname'=>$lis['library_number']];
34         $zip->addEmptyDir($lis['library_number']);
35         // 多图
36         $lis['carousel_image_arr'] = array_filter(explode(',', $lis['carousel_image']));
37         foreach ($lis['carousel_image_arr'] as $key => $imagear){
38             $ext = pathinfo($imagear)['extension'];
39             $picAllArr[] = ['fileurl'=>$imagear,'filename'=>$tmpDir.$lis['library_number'].'\carousel_image'.++$key.'.'.$ext,'dirname'=>$lis['library_number']];
40         }
41         // 详情图
42         $pattern="/<[img|IMG].*?src=[\'|\"](.*?(?:[\.gif|\.jpg]))[\'|\"].*?[\/]?>/";
43         preg_match_all($pattern,$lis['detail'],$match);
44         foreach ($match[1] as $key => $v){
45             $ext = pathinfo($v)['extension'];
46             $picAllArr[] = ['fileurl'=>$v,'filename'=>$tmpDir.$lis['library_number'].'\detail'.++$key.'.'.$ext,'dirname'=>$lis['library_number']];
47         }
48     }
49     // 开始时间
50     $yasuotusttime=microtime(true);
51     foreach ($picAllArr as $file) {
52         //判断图片是否存在
53         $isFile = checkFileExists($file['fileurl']);
54         if (!$isFile) {
55             continue;
56         }
57         //抓取图片内容
58         $fileContent = file_get_contents($file['fileurl']);
59         //添加图片到zip中
60         $zip->addFromString($file['dirname'].'\\'.basename($file['filename']), $fileContent);
61     }
62     // 结束时间
63     $yasuotuendtime=microtime(true);
64     $zip->close();
65 
66     $etime=microtime(true);
67 
68     $xiazaitime=$yasuotuendtime-$yasuotusttime;
69     $toime=$etime-$stime;
70     echo "当前页面执行时间为:{$toime}秒,下载时间{$xiazaitime}秒";
71     exit;
72 // 判断文件是哪里的,是否存在
73 function checkFileExists($file){
74     // 远程文件
75     if (strtolower(substr($file, 0, 5)) == 'https') {
76         // 远程文件
77         $header = get_headers($file, true);
78         return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
79 
80     } elseif (strtolower(substr($file, 0, 4)) == 'http') {
81         // 远程文件
82         $header = get_headers($file, true);
83         return isset($header[0]) && (strpos($header[0], '200') || strpos($header[0], '304'));
84     } else {
85         // 本地文件
86         return file_exists($file);
87     }
88 }
89 ?>

参考博客

https://www.cnblogs.com/chenhaoyu/p/11851580.html

 

posted @ 2021-05-11 15:45  周小黑  阅读(151)  评论(0编辑  收藏  举报