You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:25:15