如何实现用户点击下载时,按指定x*y分辨率下载图片而非原图
实现指定分辨率图片下载的调整方案
核心逻辑:你当前直接链接原图的实现只能下载原始分辨率文件,要输出指定分辨率的版本,需新增后端图片缩放处理接口,再调整前端下载链接指向该接口即可。
第一步:新增后端图片处理接口
在站点根目录新建resize_download.php文件,代码如下:
<?php // 基础配置 $imageDir = __DIR__ . '/images/'; // 对应你站点原图存储的路径 $allowedExt = ['jpg', 'jpeg', 'png', 'gif']; // 允许处理的图片格式 $maxWh = 2000; // 限制最大宽高,避免恶意请求占用服务器资源 // 接收请求参数 $imageName = $_GET['name'] ?? ''; $width = (int)($_GET['w'] ?? 400); $height = (int)($_GET['h'] ?? 400); // 参数合法性校验 if ( empty($imageName) || $width <= 0 || $height <=0 || $width > $maxWh || $height > $maxWh ) { die('非法请求参数'); } $sourcePath = $imageDir . $imageName; if (!file_exists($sourcePath)) { die('请求图片不存在'); } $ext = strtolower(pathinfo($sourcePath, PATHINFO_EXTENSION)); if (!in_array($ext, $allowedExt)) { die('不支持的图片格式'); } // 加载原图资源 switch ($ext) { case 'jpg': case 'jpeg': $sourceImg = imagecreatefromjpeg($sourcePath); break; case 'png': $sourceImg = imagecreatefrompng($sourcePath); break; case 'gif': $sourceImg = imagecreatefromgif($sourcePath); break; } list($srcW, $srcH) = getimagesize($sourcePath); // 生成指定分辨率的图片 $targetImg = imagecreatetruecolor($width, $height); // 兼容png透明背景 if ($ext == 'png') { imagealphablending($targetImg, false); imagesavealpha($targetImg, true); } imagecopyresampled($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height, $srcW, $srcH); // 输出下载响应头 header('Content-Type: image/' . $ext); $downloadName = pathinfo($imageName, PATHINFO_FILENAME) . "_{$width}x{$height}." . $ext; header('Content-Disposition: attachment; filename="' . $downloadName . '"'); // 输出处理后的图片 switch ($ext) { case 'jpg': case 'jpeg': imagejpeg($targetImg, null, 90); // 90为jpeg质量参数,可自行调整 break; case 'png': imagepng($targetImg); break; case 'gif': imagegif($targetImg); break; } // 销毁内存资源 imagedestroy($sourceImg); imagedestroy($targetImg); exit; ?>
第二步:调整前端下载按钮代码
将你原有下载按钮的链接改为指向上述处理接口,同时传入对应参数即可:
<a href="resize_download.php?name=<?php echo $row['image_name'] ?>&w=400&h=400" class="ms-5" download> <i class="bi bi-download" style="color: black; font-size:20px"></i> </a>
额外注意事项
- 请确保
resize_download.php和images文件夹的路径对应,避免读取图片失败 - 高并发场景建议增加已处理图片的本地缓存,重复请求同分辨率同图片时直接返回缓存文件,无需重复生成
- 如果需要支持用户自选分辨率,将链接中
w和h的固定值改为动态参数即可
内容的提问来源于stack exchange,提问作者Bleron Mexhuani
相关产品推荐
相关产品推荐

