recherche
Maisondéveloppement back-endtutoriel phpComment empaqueter le téléchargement d'une image zip en php

这篇文章主要介绍了关于php打包zip图片下载的方法,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

1.引入类包 zipfile

class zipfile {
    var $datasec = array ();
    var $ctrl_dir = array ();
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
    var $old_offset = 0;
    
    function unix2_dostime($unixtime = 0){
        $timearray = ($unixtime == 0) ? getdate () : getdate($unixtime);        
        if ($timearray [&#39;year&#39;] < 1980){
            $timearray [&#39;year&#39;] = 1980;
            $timearray [&#39;mon&#39;] = 1;
            $timearray [&#39;mday&#39;] = 1;
            $timearray [&#39;hours&#39;] = 0;
            $timearray [&#39;minutes&#39;] = 0;
            $timearray [&#39;seconds&#39;] = 0;
        }
        return (($timearray [&#39;year&#39;] - 1980) << 25) | ($timearray [&#39;mon&#39;] << 21) | ($timearray [&#39;mday&#39;] << 16) | ($timearray [&#39;hours&#39;] << 11) | ($timearray [&#39;minutes&#39;] << 5) | ($timearray [&#39;seconds&#39;] >> 1);
    }
    function add_file($data, $name, $time = 0){
        $name = str_replace(&#39;\\&#39;, &#39;/&#39;, $name);
        
        $dtime = dechex($this->unix2_dostime($time));
        $hexdtime = &#39;\x&#39; . $dtime [6] . $dtime [7] . &#39;\x&#39; . $dtime [4] . $dtime [5] . &#39;\x&#39; . $dtime [2] . $dtime [3] . &#39;\x&#39; . $dtime [0] . $dtime [1];
        eval(&#39;$hexdtime = "&#39; . $hexdtime . &#39;";&#39;);
        
        $fr = "\x50\x4b\x03\x04";
        $fr .= "\x14\x00";
        $fr .= "\x00\x00";
        $fr .= "\x08\x00";
        $fr .= $hexdtime;
        
        $unc_len = strlen($data);
        $crc = crc32($data);
        $zdata = gzcompress($data);
        $zdata = substr(substr($zdata, 0, strlen($zdata)- 4), 2);
        $c_len = strlen($zdata);
        $fr .= pack(&#39;V&#39;, $crc);
        $fr .= pack(&#39;V&#39;, $c_len);
        $fr .= pack(&#39;V&#39;, $unc_len);
        $fr .= pack(&#39;v&#39;, strlen($name));
        $fr .= pack(&#39;v&#39;, 0);
        $fr .= $name;
        
        $fr .= $zdata;
        $fr .= pack(&#39;V&#39;, $crc);
        $fr .= pack(&#39;V&#39;, $c_len);
        $fr .= pack(&#39;V&#39;, $unc_len);
        
        $this->datasec [] = $fr;
        
        $cdrec = "\x50\x4b\x01\x02";
        $cdrec .= "\x00\x00";
        $cdrec .= "\x14\x00";
        $cdrec .= "\x00\x00";
        $cdrec .= "\x08\x00";
        $cdrec .= $hexdtime;
        $cdrec .= pack(&#39;V&#39;, $crc);
        $cdrec .= pack(&#39;V&#39;, $c_len);
        $cdrec .= pack(&#39;V&#39;, $unc_len);
        $cdrec .= pack(&#39;v&#39;, strlen($name));
        $cdrec .= pack(&#39;v&#39;, 0);
        $cdrec .= pack(&#39;v&#39;, 0);
        $cdrec .= pack(&#39;v&#39;, 0);
        $cdrec .= pack(&#39;v&#39;, 0);
        $cdrec .= pack(&#39;V&#39;, 32);
        
        $cdrec .= pack(&#39;V&#39;, $this->old_offset);
        $this->old_offset += strlen($fr);
        
        $cdrec .= $name;
        
        $this->ctrl_dir[] = $cdrec;
    }
    function add_path($path, $l = 0){
        $d = @opendir($path);
        $l = $l > 0 ? $l : strlen($path) + 1;
        while($v = @readdir($d)){
            if($v == &#39;.&#39; || $v == &#39;..&#39;){
                continue;
            }
            $v = $path . &#39;/&#39; . $v;
            if(is_dir($v)){
                $this->add_path($v, $l);
            } else {
                $this->add_file(file_get_contents($v), substr($v, $l));
            }
        }
    }
    function file(){
        $data = implode(&#39;&#39;, $this->datasec);
        $ctrldir = implode(&#39;&#39;, $this->ctrl_dir);
        return $data . $ctrldir . $this->eof_ctrl_dir . pack(&#39;v&#39;, sizeof($this->ctrl_dir)) . pack(&#39;v&#39;, sizeof($this->ctrl_dir)) . pack(&#39;V&#39;, strlen($ctrldir)) . pack(&#39;V&#39;, strlen($data)) . "\x00\x00";
    }
    
    function add_files($files){
        foreach($files as $file){
            if (is_file($file)){
                $data = implode("", file($file));
                $this->add_file($data, $file);
            }
        }
    }
    function output($file){
        $fp = fopen($file, "w");
        fwrite($fp, $this->file ());
        fclose($fp);
    }
}

2.实例

$dfile =  tempnam(&#39;/tmp&#39;, &#39;tmp&#39;);//产生一个临时文件,用于缓存下载文件
$zip = new \Org\Util\Zipfile();
//----------------------
$filename = &#39;二维码&#39;.date("Y-m-d H:i",time()).&#39;.zip&#39;; //下载的默认文件名
//以下是需要下载的图片数组信息,将需要下载的图片信息转化为类似即可
$params[&#39;ids&#39;] = explode(&#39;,&#39;,$params[&#39;ids&#39;]);

//获取图片
$image = array(
     array(&#39;image_src&#39; => &#39;pic1.jpg&#39;, &#39;image_name&#39; => &#39;图片1.jpg&#39;),
     array(&#39;image_src&#39; => &#39;pic2.jpg&#39;, &#39;image_name&#39; => &#39;pic/图片2.jpg&#39;),
);

foreach($image as $v){
    $zip->add_file(file_get_contents($v[&#39;image_src&#39;]),  $v[&#39;image_name&#39;]);
    // 添加打包的图片,第一个参数是图片内容,第二个参数是压缩包里面的显示的名称, 可包含路径
    // 或是想打包整个目录 用 $zip->add_path($image_path);
}
//----------------------
$zip->output($dfile);

// 下载文件
ob_clean();
header(&#39;Pragma: public&#39;);
header(&#39;Last-Modified:&#39;.gmdate(&#39;D, d M Y H:i:s&#39;) . &#39;GMT&#39;);
header(&#39;Cache-Control:no-store, no-cache, must-revalidate&#39;);
header(&#39;Cache-Control:pre-check=0, post-check=0, max-age=0&#39;);
header(&#39;Content-Transfer-Encoding:binary&#39;);
header(&#39;Content-Encoding:none&#39;);
header(&#39;Content-type:multipart/form-data&#39;);
header(&#39;Content-Disposition:attachment; filename="&#39;.$filename.&#39;"&#39;); //设置下载的默认文件名
header(&#39;Content-length:&#39;. filesize($dfile));
$fp = fopen($dfile, &#39;r&#39;);
while(connection_status() == 0 && $buf = @fread($fp, 8192)){
    echo $buf;
}
fclose($fp);
@unlink($dfile);
@flush();
@ob_flush();
exit();

值得一提的是 打包下载时中文文件夹或中文名出现乱码时可用下面方法解决

$name = iconv(&#39;utf-8&#39;,&#39;gb2312&#39;,$name);

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

php web请求安全处理

php cocket的使用方法

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
HTML 文件压缩成 ZIP 的最佳指南HTML 文件压缩成 ZIP 的最佳指南Apr 09, 2024 pm 04:09 PM

压缩HTML文件成ZIP可提高页面加载速度。方法包括:使用在线工具(如FileOptimizer、TinyPNG)使用命令行工具(如gzip、7-zip)使用Node.js脚本(使用zlib模块)

linux压缩zip命令怎么用linux压缩zip命令怎么用Oct 08, 2023 pm 01:25 PM

zip命令是Linux系统中一个非常有用的压缩工具。通过使用zip命令,您可以轻松地将文件和目录压缩成一个zip文件,并节省存储空间和方便传输。zip命令的基本语法为“zip [选项] [压缩文件名] [要压缩的文件或目录]”。

centos7下解压文件命令(zip)详解centos7下解压文件命令(zip)详解Jan 07, 2024 pm 06:30 PM

1.压缩文件夹为zip文件[root@cgls]#zip-rmydata.zipmydata2.把mydata.zip解压到mydatabak目录里面[root@cgls]#unzipmydata.zip-dmydatabak3.mydata01文件夹和mydata02.txt压缩成为mydata.zip[root@cgls]#zipmydata.zipmydata01mydata02.txt4.直接解压mydata.zip文件[root@cgls]#unzipmydata.zip5.查看myd

7z和zip哪个无损7z和zip哪个无损Jan 19, 2021 pm 06:37 PM

7z和zip都是无损压缩。7z是一种主流高效的压缩格式,它拥有极高的压缩比;ZIP文件格式是一种数据压缩和文档储存的文件格式。7z压缩比率大些,zip次之;zip格式比较常见支技泛围广,windows操作系统默认支持zip格式。

如何使用Java中的Zip函数进行文件压缩如何使用Java中的Zip函数进行文件压缩Jun 26, 2023 pm 02:10 PM

压缩文件是一种常见的操作,能够节省磁盘的空间以及网络传输的时间,而Java中提供了Zip函数用于实现文件的压缩。本文将通过详细的介绍和实例演示来展示如何使用Java中的Zip函数进行文件压缩。一、Zip函数介绍Zip函数是Java中提供的压缩和打包工具类库,使用该函数可以将文件或文件夹压缩成一个Zip格式的文件。Zip函数中主要使用了ZipOutputStr

轻松掌握 HTML 文件 ZIP 压缩秘诀轻松掌握 HTML 文件 ZIP 压缩秘诀Apr 09, 2024 pm 05:36 PM

HTML文件ZIP压缩可以通过Python的zipfile模块实现:创建ZIP文件对象。向ZIP文件添加HTML文件。关闭ZIP文件对象。

如何利用Java调用华为云OBS对象存储服务实现图片下载如何利用Java调用华为云OBS对象存储服务实现图片下载Jul 08, 2023 am 10:09 AM

如何利用Java调用华为云OBS对象存储服务实现图片下载引言:华为云OBS(ObjectStorageService)是一种安全可靠、高扩展性和低成本的云存储服务。它提供了灵活的存储解决方案,可以在各种场景下存储和获取大量非结构化的数据,如图片、视频、文档等。本文将介绍如何使用Java编程语言调用华为云OBS对象存储服务,实现图片下载功能。步骤1:华为云

爬取网站上的图片,并自动下载到本地爬取网站上的图片,并自动下载到本地Jun 13, 2023 pm 01:28 PM

在互联网时代,人们已经习惯于从图库、社交平台等各种网站上下载图片。如果只需要下载少量图片,手动操作并不繁琐。但是,如果需要下载大量图片,手动操作将变得非常费时费力,这时就需要使用自动化技术来实现图片的自动下载。本文将介绍如何使用Python爬虫技术,从网站上自动下载图片到本地。这个过程分为两步:第一步,使用Python的requests库或者s

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

SublimeText3 Linux nouvelle version

SublimeText3 Linux nouvelle version

Dernière version de SublimeText3 Linux

Listes Sec

Listes Sec

SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.

Version Mac de WebStorm

Version Mac de WebStorm

Outils de développement JavaScript utiles

SublimeText3 version anglaise

SublimeText3 version anglaise

Recommandé : version Win, prend en charge les invites de code !