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 zlib


php-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);

文件上传

1、文件上传相对比较麻烦,首先要把文件移动到指定的目录下,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;
        }
    }
}

到此这篇关于PHP操作ZipArchive实现文件上传下载功能的文章就介绍到这了,更多相关PHP ZipArchive文件上传下载内容请搜索恩蓝小号以前的文章或继续浏览下面的相关文章希望大家以后多多支持恩蓝小号!

原创文章,作者:ILWFU,如若转载,请注明出处:http://www.wangzhanshi.com/n/713.html

(0)
ILWFU的头像ILWFU
上一篇 2024年12月17日 17:53:16
下一篇 2024年12月17日 17:53:18

相关推荐

  • PHP7中的性能优化

    php7的一些特性 打破一切 PHP7要打破一切。 PHP开发人员应该接受打破版本之间向下兼容的定律。只要不允许大量的向后兼容,PHP7将是一个高度尊重的语言。 1、创建一个具体的…

    2025年1月1日
  • ubuntu16.04如何安装php5

    ubuntu16.04安装php5的方法:首先移除默认及已安装的PHP包;然后添加PPA;最后通过“sudo apt-get install php5.6”安装php5.6即可。 …

    php 2025年1月2日
  • php7可不可运行thinkphp5

    php7能运行thinkphp5吗? php7能运行thinkphp5,ThinkPHP5支持PHP7。ThinkPHP5支持PHP5.6.0+,也就是说5.6以上的版本都支持。 …

    php 2025年1月1日
  • PHP7中如何连接数据库

    使用原生PHP来连接MySQL的方法有 MySQL库、MySQLi库以及PDO,由于PHP 7已经废除 MySQL库,所以建议使用MySQLi和PDO。 连接 MySQLi有两种风…

    php 2025年1月1日
  • 使用PHP和RabbitMQ实现消息队列功能

    前言 今天我们来做个小试验,用PHP和RabbitMQ实现消息队列功能。 前期准备,需要安装好docker、docker-compose的运行环境。 使用docker部署php服务…

    2024年12月17日
  • vagrant怎么搭建php7环境

    安装nginx 首先需要跟新一些ngin的相关源。 $ rpm -Uvh http://nginx.org/packages/centos/7/noa…

    2025年1月1日
  • 如何使用yum命令安装php7和相关扩展

    php有什么用 php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、Java、Perl以及php自创新的语法,主要用来做网站开发,许多小型网站都用php开发,因…

    php 2025年1月1日
  • php5中对象复制、clone、浅复制与深复制的示例分析

    具体如下: 对象复制的由来 为什么对象会有“复制”这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 /** * 电视机类 */…

    php 2025年1月2日
  • php7的垃圾回收和php5有哪些区别

    php5和php7的垃圾回收机制都是利用引用计数。 什么叫做引用计数? 由于PHP是用C来写的,C里面有一种东西叫做结构体,我们PHP的变量在C中就是用这种方式存储的。 每个PHP…

    php 2025年1月1日
  • php7与php5有什么区别

    今天小编给大家分享的是php7与php5有什么区别?,很多人都不太了解,今天小编为了让大家更加了解php7与php5的区别,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的…

    2025年1月1日

发表回复

登录后才能评论