PHP - ZipArchive上传、下载实例

news/2024/10/18 14:16:06/

概述

在很多实际生产场景都需要批量上传、下载一些文件的处理,整理了使用PHP语言操作ZipArchive实践和实例,ZipArchive需要服务器上安装zlib库,php扩展中安装zip扩展。

服务器环境扩展

ZipArchive类库的PHP版本要求如下,另外php需要查看是否已经成功安装zip扩展,服务器上需要安装zlib包,具体查看方法在下面的代码段里。

# ZipArchive 类版本要求,来自官网
# (PHP 5 >= 5.2.0, PHP 7, PHP 8, PECL zip >= 1.1.0)#查看是否安装zlib包
yum list installed | grep zlibphp-fpm -m | grep zip
zip$zipVersion = phpversion('zip');
echo "Zip Extension Version: " . $zipVersion.PHP_EOL;# 输出结果 
# Zip Extension Version: 1.15.6

实践

ZipArchive类,使用范围非常丰富,这篇博客里主要介绍上传和下载功能,先整理下载的实践实例,有几点需要特别注意的点:

  • 目录和文件的权限,包括复制的源文件和目标文件
  • 移动的文件夹一定要存在
  • ZipArchive扩展所需要的zlib和zip扩展,注意版本的差异性

文件下载

文件下载相对比较容易,先创建一个空的zip包,在把需要压缩的文件添加进zip包里。

//压缩包生成的路径,最后文件添加在这个zip包中
$destination = '/home/wwwroot/testDemo.zip';if (!file_exists(dirname($destination))) {mkdir(dirname($destination), 0777, true);
}$zip = new ZipArchive;
if ($zip->open($destination, ZIPARCHIVE::CREATE) !== true) {echo '服务器错误'.PHP_EOL;
}$filePath = '/server_images/data/劳务派遣协议.pdf';$fileSuffix = pathinfo($filePath,PATHINFO_EXTENSION); // 输出 pdf
$fileName = pathinfo($filePath, PATHINFO_FILENAME);   // 输出 劳务派遣协议
$rename = 'stark_' . $fileName.'.'.$fileSuffix; //新名字#把路径$filePath 生成到zip包中,$rename是新的文件名
$zip->addFile($filePath,  $rename );# 创建目录的路径
$createPathName = '';
$zip->addEmptyDir($createPathName);
$zip->close();$strFile = '劳务派遣协议.zip';
header("Content-type:application/zip");
header("Content-Disposition:attachment;filename=" . $strFile);
readfile($destination);

文件上传

文件上传相对比较麻烦,首先要把文件移动到指定的目录下,demo中的例子是$file_path

$file_path = '/home/wwwroot/upload/';
if (!is_dir(dirname($file_path))) {mkdir(dirname($file_path), 0777, true);
}
//把文件移动到$file_path目录里
if( is_uploaded_file($_FILES['file']['tmp_name']) ) {$move_re = move_uploaded_file($_FILES['file']['tmp_name'], $file_path);if (!$move_re) {echo '上传失败'.PHP_EOL;}
}else{echo '请检查数据来源'.PHP_EOL;
}

2、对压缩包进行解压

$destination = '/home/wwwroot/labor_con2.zip';$zip = new ZipArchive;
if ($zip->open($destination, ZIPARCHIVE::CREATE) !== true) {echo '服务器错误'.PHP_EOL;
}//解压到目标目录 $extractDir
$extractDir = '/home/wwwroot/zip';
if (!is_dir($extractDir)) {mkdir($extractDir, 0777, true);
}$zip->extractTo($extractDir);
$zip->close();

3、把解压的文件移动到目标的资源文件夹里

$zipName = 'labor_con2';
$realExtractDir = $extractDir.'/'.$zipName.'/';
$folders = scandir($realExtractDir);//把$extractToPath 移动到 $targetSrc位置
$targetDir = '/server_images/data/target/';
if (!is_dir($targetDir)) {mkdir($targetDir, 0777, true);
}foreach ( $folders as $file){if(!in_array($file,['.','..','.DS_Store'])){$sourceSrc = $realExtractDir.$file;$targetSrc = $targetDir.$file;if (file_exists($sourceSrc)) chmod($sourceSrc, 0755);if (file_exists($targetSrc)) chmod($targetSrc, 0755);$result = copy($sourceSrc, $targetSrc);if($result){echo '文件复制成功了'.PHP_EOL;}}
}

最后

因为时间关系,乱码或者是其他别的一些知识,等之后抽时间在更新,编码不易,全靠硬挤,加油吧。


http://www.ppmy.cn/news/1401912.html

相关文章

netty构建udp服务器以及发送报文到客户端客户端详细案例

目录 一、基于netty创建udp服务端以及对应通道设置关键 二、发送数据 三、netty中的ChannelOption常用参数说明 1、ChannelOption.SO_BACKLOG 2、ChannelOption.SO_REUSEADDR 3、ChannelOption.SO_KEEPALIVE 4、ChannelOption.SO_SNDBUF和ChannelOption.SO_RCVBUF 5、Ch…

Kotlin by关键字

委托的概念 委托是一种设计模式,它的基本概念是:操作对象自己不会去处理某段逻辑,而是会把工作委托给另外一个辅助对象去处理。 class NewList<out T>(private val list: MutableList<T>) {fun isEmpty() = list.isEmpty()fun add(item: @UnsafeVariance T) = l…

排序—插入排序

本专栏和大家分享关于排序的算法,其中有插入排&#xff08;直接插入排序和希尔排序&#xff09;、选择排序&#xff08;直接选择排序和堆排&#xff09;、交换排序&#xff08;冒泡排序和快速排序&#xff09;、归并排序以及其他非基于比较的排序 本文与大家分享插入排序 目录 …

高德地图key注册教程_地图数据采集软件

1.先注册成为开发者账号。 2.再申请高德地图Key。 3.把申请得到的高德地图Key填入软件中。 1.请先打开以下连接 高德地图key注册地址 易地图数据采集大师手机App版介绍 易地图数据采集大师电脑PC版介绍 2.注册新用&#xff08;如果已有开发者账号&#xff0c;本步可省略&am…

蓝桥杯 java 承压计算

题目: 思路&#xff1a; 1&#xff1a;其中的数字代表金属块的重量(计量单位较大) 说明每个数字后面不一定有多少个0 2&#xff1a;假设每块原料的重量都十分精确地平均落在下方的两个金属块上&#xff0c;最后&#xff0c;所有的金属块的重量都严格精确地平分落在最底层的电子…

亚远景科技-Hardware Engineering SPICE课程大纲

Hardware SPICE是intacs为电子硬件开发创建的PRM/PAM过程参考和评估模型&#xff0c;其符合ISO/IEC15504-2, Automotive SPICE 4.0, ISO 26262-1和5: 2018等标准。 无论您是想要深入了解硬件工程领域&#xff0c;还是希望成长为Provisional初级、Competent主任和Principal首席硬…

kubernetes-networkpolicies网络策略问题

kubernetes-networkpolicies网络策略问题 问题描述 重点重点重点&#xff0c;查看我的博客CKA考题&#xff0c;里面能找到解决方法 1.部署prometheus监控的时候&#xff0c;都部署成功&#xff0c;但是web访问503-504超时 2.添加ingress的时候也是访问不到&#xff0c;其他命…

PA1A-24V 通用继电器 5A 24VDC 一组常开

PA1A-24V是一款继电器&#xff0c;它是一种电气开关&#xff0c;通常用于自动化控制和电子设备中。广泛应用于机械设备、自动化控制系统以及电子设备等领域。 制造商: Panasonic 产品种类: 通用继电器 RoHS: 详细信息 产品: Power Relays 类型: …