ThinkPHP5.1 多图片,多文件打压缩包
情景:前端下载一个以上图片,采用下载压缩包方法
使用PHP自带的ZipArchive类
开启压缩类的方法
这里我将方法大概描述一下避免链接失效
Windows环境:
首先需要从官网上下载,下载地址 https://windows.php.net/downloads/pecl/releases/zip/
打开官网列表后需要查找适合自己的PHP版本和系统的zip,我的PHP版本是5.5的,这里我选择的版本号是1.13.5
image.png
下载完后解压,把里面的php_zip.dll文件放到PHP的扩展文件夹里
image.png
扩展文件夹路径一般都是在PHP版本文件夹里的ext文件夹,譬如我的就是D:\php-5.5.38\ext
把php_zip.dll文件放进去后,打开PHP的配置文件php.ini,添加extension=php_zip.dll,保存后,重启apache服务器
Linux环境:
1、在Linux下没有php_zip.dll这个文件(有也不会起作用的),所以需要重新编译一下php的zip模块。具体安装方法如下:
cd /usr/src
wget http://pecl.php.net/get/zip
tar -zxvf zip
cd zip-1.x.x
phpize
./configure
make
sudo make instal
其中, 在最后使用make install命令的时候,可能需要用到root的权限,所以建议使用sudo来运行。安装完之后,屏幕上会提示zip.so的位置。然后将其记录下来,如:/usr/local/lib/php/extensions/zip.so。
2、使用root权限修改php.ini(通常可能会在/usr/local/lib/文件夹下,不过视当初安装php而定,可以通过phpinfo()来查看):
增加extension = /usr/local/lib/php/extensions/zip.so,然后同样在php.ini文件中,将 zlib.output_compression = Off 改为 zlib.output_compression = On ;
3、最后别忘了重启一下Apache:apachectl restart;
这个针对php的zip模块就安装完成了,能够在php中使用ZipArchive类了。
ps:查看php.ini文件位置的方法是:
<?php phpinfo(); ?>PHP代码
//打压缩文件
//这里$file= ['/public/uploads/20200711/16-39-51-7o0d9i-1527.png', '/public/uploads/20200711/16-39-50-n1kln2-1527.png'];
==注意==图片路径必须是本机文件路径,网络路径会报错
//$id=唯一标识
public function zip($files,$id) {
==注意==压缩包路径必须是本机文件路径,网络路径会报错
$upload_zip_dir = config('save_path') . date(config('uploaddir'), time()) . '/';//存放在当前目录的upload文件夹下
is_dir($upload_zip_dir) or @mkdir($upload_zip_dir, 0777, true);
$zipName = $upload_zip_dir . $id .'.zip';
$zip = new \ZipArchive;//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) !== TRUE) {
exit('无法打开文件,或者文件创建失败');
}
foreach ($files as $val) {
if (file_exists($val)) {
$zip->addFile($val, basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下
}
}
$zip->close();//关闭
if (!file_exists($zipName)) {
exit("无法找到文件"); //即使创建,仍有可能失败
}
return $zipName;
//如果不要下载,下面这段删掉即可,如需返回压缩包下载链接,只需 return $zipName;
// header("Cache-Control: public");
// header("Content-Description: File Transfer");
// header('Content-disposition: attachment; filename=' . basename($zipName)); //文件名
// header("Content-Type: application/zip"); //zip格式的
// header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
// header('Content-Length: ' . filesize($zipName)); //告诉浏览器,文件大小
// @readfile($zipName);
}
以上完毕