如何用PHP将从私有站点下载的多张图片打包为Zip文件
如何将批量下载的图片打包为Zip文件(PHP实现)
嘿,我来帮你搞定这个需求!PHP自带的ZipArchive扩展就能完美实现图片打包的功能,下面是修改后的完整代码,我会给你拆解关键步骤,确保你能轻松理解每一部分:
前提准备
首先要确认你的服务器已经启用了ZipArchive扩展(大部分主流主机默认都开启了,如果没开的话需要在php.ini里开启extension=zip),另外要保证manga/目录有写入权限,不然图片没法存进去哦。
修改后的完整代码
<?php // 先检查必要的POST参数是否存在 if (!isset($_POST['num'], $_POST['img'])) { die("缺少必要的参数!"); } $num = (int)$_POST['num']; $imgPrefix = $_POST['img']; $mySaveDir = "manga/"; $zipFileName = "downloaded_images.zip"; // 创建保存目录(如果不存在的话) if (!is_dir($mySaveDir)) { mkdir($mySaveDir, 0755, true); } // 初始化ZipArchive对象 $zip = new ZipArchive(); // 打开zip文件,CREATE表示创建新文件,OVERWRITE表示覆盖已存在的文件 if ($zip->open($zipFileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) { die("无法创建Zip文件!"); } // 循环下载图片并添加到Zip for ($i = 1; $i <= $num; $i++) { $urlToImage = $imgPrefix . $i . '.jpg'; $filename = basename($urlToImage); $completeSaveLoc = $mySaveDir . $filename; // 下载图片到本地 $imageContent = file_get_contents($urlToImage); if ($imageContent === false) { echo "第{$i}张图片下载失败<br>"; continue; } file_put_contents($completeSaveLoc, $imageContent); echo "第{$i}张图片已下载<br>"; // 将图片添加到Zip文件中 $zip->addFile($completeSaveLoc, $filename); } // 关闭Zip文件 $zip->close(); // 输出Zip文件让用户下载 header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: ' . filesize($zipFileName)); readfile($zipFileName); // 可选:清理临时文件(下载完后删除本地图片和Zip文件) // 删除manga目录下的所有图片 foreach (glob($mySaveDir . "*.jpg") as $file) { unlink($file); } // 删除空的manga目录 rmdir($mySaveDir); // 删除Zip文件 unlink($zipFileName); ?>
关键部分解释
- ZipArchive初始化:
new ZipArchive()创建一个打包对象,open()方法用来创建或打开Zip文件,CREATE | ZipArchive::OVERWRITE表示如果文件不存在就创建,存在就覆盖。 - 添加文件到Zip:
$zip->addFile($localFilePath, $zipInnerFileName)第一个参数是本地文件的路径,第二个参数是Zip文件里显示的文件名(可以自定义,这里用原文件名)。 - 触发下载:通过设置
Content-Type、Content-Disposition等HTTP头,让浏览器识别这是一个Zip下载文件,readfile()输出文件内容。 - 清理临时文件:最后一段代码是可选的,如果不需要保留本地的图片和Zip文件,可以执行删除操作,避免占用服务器空间。
额外提示
如果下载的图片数量很多或者文件很大,可能会遇到PHP超时问题,可以在代码开头加上set_time_limit(0);来取消超时限制。另外,file_get_contents()有时候可能无法下载某些有反爬机制的站点图片,遇到这种情况可以考虑用cURL来替代,兼容性会更好。
内容的提问来源于stack exchange,提问作者abbas ameer
相关产品推荐
相关产品推荐

