PHP - ZipArchive上传、下载实例

概述

在很多实际生产场景都需要批量上传、下载一些文件的处理,整理了使用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.mzph.cn/news/775126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse11-ClickHouse中文件引擎与物化视图的组合拳

全文概览: 什么是物化视图 使用场景 如何实现这个需求 建立一个使用表引擎的表,作为物化视图的目标表确定需要查询的SQL创建物化视图测试 文件引擎其实是一个不常用的特殊表引擎,结合【ClickHouse09-表引擎之文件引擎】一章节的基础介绍 这…

Flutter 常用插件Plugin整理并附带实例

最近有点空闲时间,正好写一篇文章,整理一下我们在Flutter开发中常用的插件Plugin使用并附带上实例。 在日常开发中,整个demo目前应该满足大家所有的开发需求,例如:http请求、列表刷新及加载、列表分组、轮播图、视频播…

AI浪潮席卷游戏业:未来5~10年,游戏或将由AI生成

一年前,因为AI失业的第一批人,在游戏行业出现了。游戏原画、翻译等外包团队开始遭遇砍单,AI绘画工具的发展速度和水平已经几乎可以媲美科班出身、初级经验的人类画师。 一年时间过去,在游戏制作的毛细血管中,越来越多…

SpringBoot3的RabbitMQ消息服务

目录 预备工作和配置 1.发送消息 实现类 控制层 效果 2.收消息 3.异步读取 效果 4.Work queues --工作队列模式 创建队列text2 实体类 效果 5.Subscribe--发布订阅模式 效果 6.Routing--路由模式 效果 7.Topics--通配符模式 效果 异步处理、应用解耦、流量削…

The C programming language (second edition,KR) exercise(CHAPTER 1)

E x c e r c i s e 1 − 2 Excercise\quad 1-2 Excercise1−2:测试结果如图1所示,这里需要注意的是转义字符序列 \ o o o \backslash ooo \ooo和序列 \ x h h \backslash xhh \xhh分别表示3个八进制数和2个十进制数对应的值对应于 A S C I I ASCII ASCII…

Django Cookie和Session

Django Cookie和Session 【一】介绍 【1】起因 HTTP协议四大特性 基于请求响应模式:客户端发送请求,服务端返回响应基于TCP/IP之上:作用于应用层之上的协议无状态:HTTP协议本身不保存客户端信息短链接:1.0默认使用短…

python asyncio websockets server

python websocket server在收到接受消息处理完后会默认关闭连接。需要在msg_handler里面加个while true就能一直保持连接了。 start_server websockets.serve(msg_handler, "0.0.0.0", 29967) asyncio.get_event_loop().run_until_complete(start_server) asyncio.…

Chronos: 将时间序列作为一种语言进行学习

这是一篇非常有意思的论文,它将时间序列分块并作为语言模型中的一个token来进行学习,并且得到了很好的效果。 Chronos是一个对时间序列数据的概率模型进行预训练的框架,它将这些值标记为与基于transformer的模型(如T5)一起使用。模型将序列的…

小谈HTML5和CSS3的一些重要特性,页面重构需要注意的方面?

HTML5和CSS3是当前前端开发中最重要的技术之一。它们提供了丰富的功能和效果,使得页面设计更加灵活和交互性更强。在进行页面重构时,我们需要注意一些方面,以确保页面的质量和性能。下面将详细介绍HTML5和CSS3的一些重要特性,并讨…

vscode连接不上,终端ssh正常,一直输入密码正确但是无法登录

若是之前链结果突然等不上,使用第一个链接 若是第一次链接连不上,先使用第二个链接,在使用第一个链接 原因:原因是服务器端的wget命令不能使用,vscode需要服务器端下载个文件,无法下载就导致了如上的错误…

BaseDao封装增删改查(超详解!)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍对数据库中表中的数据进行增改删查询,封装一个工具类(BaseDao)的详细使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 &…

ActiveMQ Artemis 系列| High Availability 主备模式(消息复制) 版本2.19.1

一、ActiveMQ Artemis 介绍 Apache ActiveMQ Artemis 是一个高性能的开源消息代理,它完全符合 Java Message Service (JMS) 2.0 规范,并支持多种通信协议,包括 AMQP、MQTT、STOMP 和 OpenWire 等。ActiveMQ Artemis 由 Apache Software Foun…

正则表达式篇

文章目录 1. 导入re模块2. 正则表达式的基本模式3. re模块的主要函数和方法4. 示例 正则表达式(Regular Expression,常简写为regex或regexp)是一种强大的文本处理工具,它使用一种特殊的字符序列来帮助用户检查一个字符串是否与某种…

C++ ——数组介绍和实例

文章目录 **定义数组****初始化数组****访问数组元素****一维数组与多维数组****数组与指针****数组的局限性****现代C中的替代方案** 以下是一个C程序实例,演示了如何定义、初始化、访问一维数组以及使用循环遍历数组: C ——数组 C 中的“数组”是一种…

vue2项目设置浏览器标题title及图标logo

工作中肯定会遇到要修改网页的标题title及图标logo 一、固定设置标题方案 方法一:在vue.config.js文件,添加如下代码: chainWebpack: config > {// 配置网页标题config.plugin(html).tap((args) > {args[0].title 标题return args})…

《装饰器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 模式说明: 方案: 装饰类和派生类同根,然后装饰类中放一个派生类,以在接口不动的情况下增加功能优点: 可以灵活地扩展对象功能&#xf…

[TS面试]keyof和typeof关键字作用?

keyof和typeof关键字作用? keyof 索引类型查询操作符, 获取索引类型属性名, 构成联合类型 typeof 获取一个变量或者对象的类型 let str:string ‘hello’ // typeof str >:string keyof typeof 获取 联合类型的key enum A{A, B, C }type unionType keyof typeof A; /…

static修饰成员的作用

1、static概念 声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数**,称之为静态成员函数。**静态成员变量一定要在类外进行初始化。 class A{ public: A() { _scount; } A…

数字身份的革命:解锁 Web3 的身份验证技术

引言 随着数字化时代的到来,个人身份认证成为了日常生活和商业活动中不可或缺的一部分。传统的身份验证方式存在着安全性低、易伪造、不便利等问题,因此,人们迫切需要一种更安全、更便捷的身份验证技术。在这样的背景下,Web3的身…

macos下 jupyter服务安装和vscode链接密码设置 .ipynb文件

最近收到了一些后缀为.ipynb的文件, 这个文件就是使用jupyter编辑的,于是就需要安装一个jupyter服务, 对于最新版本的jupyter 网上很多的资料都已经过期了,这里以最新版本的jupyter为例。 jupyter lab安装 jupyter 这个工具包含…