Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP图片压缩失效:常见原因与正确实现教程_创想鸟

PHP图片压缩失效:常见原因与正确实现教程

php图片压缩失效:常见原因与正确实现教程

本教程旨在解决PHP图片压缩后文件大小未减小的问题。核心原因是压缩操作后,原始未压缩文件错误地覆盖了已压缩的文件。文章将详细解释这一常见错误,提供正确的图片压缩和上传代码示例,并探讨PHP图片处理的最佳实践,确保图片文件在上传至服务器时能有效减小。

PHP图片压缩失效问题解析

在开发Web应用时,处理用户上传的图片是常见需求。为了优化网站性能和存储空间,对上传的图片进行压缩是必不可少的步骤。然而,开发者在实现图片压缩功能时,可能会遇到一个常见问题:图片经过压缩处理后,其文件大小却并未减小。

这个问题的根本原因在于文件处理流程中的一个逻辑错误:在图片被成功压缩并保存到目标位置后,原始的未压缩文件又被移动到了同一个目标位置,从而覆盖了之前生成的压缩文件。

考虑以下典型的PHP图片上传和压缩流程:

立即学习“PHP免费学习笔记(深入)”;

用户上传图片文件。PHP接收文件,并将临时文件路径存储在 $_FILES[‘file’][‘tmp_name’]。自定义的压缩函数读取这个临时文件,进行压缩处理,并将压缩后的新图片保存到指定的目标路径。随后,使用 move_uploaded_file() 函数将原始的临时文件移动到与压缩文件相同的目标路径。

问题就出在第4步。move_uploaded_file() 函数的目的是将上传的临时文件移动到最终的存储位置。如果在此之前已经通过压缩函数生成了新的文件并保存到了目标位置,那么 move_uploaded_file() 就会将原始的、未压缩的临时文件覆盖掉之前生成的压缩文件,导致最终存储的仍然是原始大小的图片。

正确的图片压缩与上传流程

为了正确实现图片压缩并避免文件覆盖,我们需要调整文件处理的顺序和逻辑。一旦压缩函数将图片处理并保存到目标位置,就不再需要 move_uploaded_file() 函数将原始临时文件移动到该位置。实际上,如果压缩成功,原始临时文件就可以被忽略或删除。

以下是修正后的代码示例,展示了如何正确地压缩和上传图片:

route_params['userid'];            $postid = $this->route_params['postid'];            // 2. 文件上传检查            if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) {                // 处理文件上传错误                // 例如:echo "文件上传失败,错误码:" . $_FILES['file']['error'];                return;            }            // 3. 生成唯一文件名和目标路径            $path_parts = pathinfo($_FILES['file']['name']);            $extension = strtolower($path_parts['extension']); // 统一小写扩展名            $filename = uniqid('cover_', true) . '.' . $extension; // 更安全的唯一文件名生成方式            $directoryName = dirname(__DIR__) . "/images/$userid/listings/$postid/coverimage/";            // 4. 检查并创建目录            if (!is_dir($directoryName)) {                if (!mkdir($directoryName, 0777, true)) {                    // 目录创建失败                    // 例如:echo "无法创建目录: $directoryName";                    return;                }            }            $destinationPath = $directoryName . $filename;            // 5. 压缩并保存图片            // 假设我们希望压缩到JPEG格式,即使原始是PNG,也可以转换为JPEG            // 或者根据原始图片类型保存为相同类型            $compressionQuality = 75; // 压缩质量,0-100            // 建议:如果希望统一输出格式,例如全部输出为JPEG,可以在这里指定新的扩展名            // $newFilename = uniqid('cover_', true) . '.jpg';            // $newDestinationPath = $directoryName . $newFilename;            // $compressionResult = compressImage($_FILES['file']['tmp_name'], $newDestinationPath, $compressionQuality);            // 如果保持原格式压缩:            $compressionResult = compressImage($_FILES['file']['tmp_name'], $destinationPath, $compressionQuality);            if ($compressionResult) {                // 压缩成功,更新数据库                // Post::updateCoverimage($filename, $postid); // 使用 $filename 或 $newFilename                echo "图片压缩并上传成功!";            } else {                // 压缩失败                // 例如:echo "图片压缩失败!";            }            // !!!注意:这里不再需要 move_uploaded_file()            // move_uploaded_file($_FILES['file']['tmp_name'], $directoryName . $filename);        }        // 示例:获取帖子信息,根据实际需求调整        // $this->post = Post::findByID($postid);    }}

在上述代码中,关键的改动是:

将 compressImage 函数定义在类外部,作为独立的辅助函数,避免每次请求都重新定义。在调用 compressImage() 函数后,直接使用其返回结果判断压缩是否成功。移除了 move_uploaded_file($_FILES[‘file’][‘tmp_name’], $directoryName . $filename); 这一行。 因为 compressImage 函数已经负责将处理后的图片保存到 destinationPath,原始的临时文件不再需要移动。

深入理解 compressImage 函数

compressImage 函数是实现图片压缩的核心。它利用了PHP的GD库。

getimagesize($source): 此函数用于获取图片的大小和类型信息。其返回数组中的 mime 键包含了图片的MIME类型(例如 image/jpeg, image/png),这对于判断如何创建图像资源至关重要。imagecreatefromjpeg($source) / imagecreatefrompng($source) / imagecreatefromgif($source): 这些函数根据不同的图片类型,从源文件创建一个新的图像资源。这是GD库操作图片的第一步。imagejpeg($image, $destination, $quality): 此函数将GD图像资源保存为JPEG文件。$quality 参数是一个0到100的整数,100表示最高质量(文件最大),0表示最低质量(文件最小)。imagepng($image, $destination, $quality): 此函数将GD图像资源保存为PNG文件。其 $quality 参数与JPEG不同,范围是0到9,其中0表示无压缩,9表示最大压缩。在示例中,我们提供了一个简单的转换逻辑来匹配0-100的质量输入。imagedestroy($image): 在完成图像操作后,调用此函数来释放与图像资源相关的内存,这是良好的编程习惯。

注意事项与最佳实践

文件类型验证: 除了检查 $_FILES[‘file’][‘error’],还应该严格验证上传文件的MIME类型和扩展名,防止恶意文件上传。例如,只允许 image/jpeg、image/png 等。安全性:文件名生成: 使用 uniqid() 或其他更安全的唯一文件名生成方式,并结合文件扩展名,而不是直接使用用户上传的文件名。目录权限: mkdir($directoryName, 0777, true) 中的 0777 权限过于宽松,在生产环境中应使用更严格的权限,如 0755 或 0775,并确保Web服务器用户有写入权限。输入过滤: filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING) 适用于POST数据,但 $_FILES 数组的内容(如文件名、类型)也需要单独进行验证和清理。错误处理: 在文件上传、目录创建、图片压缩等各个环节都应加入健壮的错误处理机制,例如记录日志、向用户显示友好的错误消息等。图片质量与大小的权衡: 压缩质量需要根据实际需求进行调整。过高的质量会使文件变大,过低的质量会严重影响图片清晰度。通常,70-85的JPEG质量是一个不错的折衷点。支持更多图片格式: 如果需要处理GIF、WebP等格式,需要在 compressImage 函数中添加相应的 imagecreatefrom… 和 image… 函数支持。文件路径管理: 确保生成的文件路径是绝对路径,并且可被Web服务器访问和写入。异步处理: 对于大量或非常大的图片,可以在图片上传后,将压缩任务放入消息队列,由后台进程异步处理,避免阻塞用户请求。

总结

PHP图片压缩失效的主要原因是压缩后的文件被原始未压缩文件覆盖。通过移除多余的 move_uploaded_file() 调用,并确保压缩函数将处理后的图片直接保存到目标位置,即可解决此问题。在实现图片上传和处理功能时,务必注意文件类型验证、安全性、错误处理以及性能优化,以构建健壮高效的Web应用。

以上就是PHP图片压缩失效:常见原因与正确实现教程的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1340427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP图像压缩后文件大小未改变:常见错误与解决方案
上一篇 2025年12月13日 03:51:04
防止WordPress AJAX表单重复提交的客户端策略
下一篇 2025年12月13日 03:51:22

相关推荐

  • 如何在Java中配置与数据库连接环境

    答案:Java中配置数据库连接需引入JDBC驱动,如MySQL在Maven中添加对应依赖;通过DriverManager或连接池(如HikariCP)获取Connection,使用try-with-resources管理资源;建议将连接参数存入properties文件,并处理常见问题如驱动加载、权限…

    2026年9月21日
    000
  • PHP错误日志怎么查看_PHP错误日志定位与查看方法

    要查看PHP错误日志,首先确定php.ini中error_log路径,若未设置则检查Web服务器(如Apache/Nginx)错误日志;确保log_errors=On、error_reporting合理配置,并通过tail、grep等工具分析日志,结合框架日志和系统日志(如syslog)全面定位问题…

    2026年9月21日
    200
  • PHP PDO lastInsertId() 返回 0 的原因与解决方案

    在使用 PHP PDO 的 lastInsertId() 方法时,如果意外返回 0,通常是因为在执行 INSERT 语句后,又创建了一个新的数据库连接实例来调用 lastInsertId()。lastInsertId() 依赖于在同一数据库会话中获取最后插入的自增 ID。本文将深入解析此问题,并提供…

    2026年9月21日
    500
  • mysql如何实现后台管理系统

    答案:基于MySQL的%ignore_a_1%需设计用户、权限、日志等表结构,通过后端语言实现安全的CRUD接口与JWT认证,前端展示数据并控制权限,确保系统安全稳定。 实现一个基于 MySQL 的后台管理系统,核心是构建一个安全、稳定、可扩展的系统架构,将数据库作为数据存储层,配合后端语言和前端界…

    2026年9月21日
    000
  • 115网盘资源查找入口_115网盘资源快速链接通道

    115网盘资源查找入口为http://www.115.com/,支持多平台访问、高效媒体管理及安全存储,提供网页端与客户端多种使用方式。 115网盘资源查找入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来115网盘资源快速链接通道,感兴趣的网友一起随小编来瞧瞧吧! http://www…

    2026年9月21日
    000
  • linux内核定时器实验

    linux内核定时器实验linux内核定时器实验linux内核定时器实验linux内核定时器实验

    大家好,又见面了,我是你们的朋友全栈君。 文章目录一、linux时间管理和内核定时器简介1.内核时间管理简介2.内核定时器简介1.init_timer 函数2.add_timer 函数3.del_timer 函数4.del_timer_sync 函数5.mod_timer 函数3.linux内核短延…

    2026年9月21日 用户投稿
    000
  • WordPress插件定制:使用Filter Hook修改邮件通知接收者

    本教程将指导您如何在WordPress中利用Filter Hook定制插件行为,特别是修改第三方插件的邮件通知接收者。我们将详细讲解如何识别目标Filter、理解其参数,并正确编写回调函数来拦截或修改数据,以实现自定义的邮件发送逻辑,避免因参数不匹配导致的错误。 WordPress Hook机制概览…

    2026年9月21日
    100
  • 谷歌浏览器官方在线访问 最新版Chrome官网登录

    谷歌浏览器官方在线访问入口是https://www.google.cn/chrome/,提供简洁界面、跨设备同步、高效内核、安全防护和丰富扩展生态。 谷歌浏览器官方在线访问入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来最新版Chrome官网登录地址,想要获取纯净浏览体验的网友一起随小…

    2026年9月21日
    200
  • Swoole如何实现一个UDP服务器

    答案:使用Swoole可轻松创建高性能UDP服务器。通过new SwooleServer()设置UDP套接字,监听Packet事件接收数据,利用sendto()回复客户端;结合set()配置worker_num等参数优化性能,配合PHP UDP客户端测试通信,适用于高并发、低延迟场景。 使用Swoo…

    2026年9月21日
    300
  • PHP简易路由框架构建:从URL解析到动态控制器加载的实践指南

    本文旨在指导读者构建一个基础的PHP路由系统,实现URL路径到控制器方法的高效映射。内容涵盖URL解析、控制器动态加载、方法调用以及关键的错误处理机制,特别强调如何避免常见的“未定义变量”错误和文件包含路径问题,确保路由系统稳定且易于维护。 一、路由系统核心原理 构建一个简单的php路由系统,其核心…

    2026年9月21日
    200
  • php switch语句怎么用_php中switch条件判断语句的用法示例

    答案:PHP中switch语句用于多条件判断,语法为switch(表达式){case值:代码;break;},通过松散比较匹配case值,执行对应代码块,遇到break跳出避免穿透,default处理无匹配情况。示例根据$day输出星期几,注意事项包括case值不可为表达式、需注意类型松散比较、省略…

    2026年9月21日
    200
  • 抖音电商与独立商城怎么结合?流量互通与转化全攻略

    许多自建电商平台的运营者正积极探索与抖音电商的合作路径,以期借助其庞大的用户基数实现流量增长和销售转化提升。虽然抖音能为独立商城导入可观的新用户,但要真正实现高效联动,必须依赖技术系统的深度对接与精准的内容运营策略。以下是抖音与独立商城融合的关键路径及实操建议。 如何实现抖音与独立商城的店铺互通? …

    2026年9月21日
    100
  • Linux目录结构学习常见问题汇总

    Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总Linux目录结构学习常见问题汇总

    Linux只有一个根目录,所有设备挂载于此,形成统一树状结构。根目录下各路径分工明确:/bin和/sbin分别存放用户与管理员命令;/etc集中配置文件;/home为用户家目录;/var存储日志等动态数据;/tmp用于临时文件;/usr存放系统程序,/usr/local供手动安装软件;/dev包含设…

    2026年9月21日 用户投稿
    200
  • Laravel 8 登录后重定向到仪表盘的全面指南

    本文深入探讨了 Laravel 8 中用户登录后重定向到仪表盘的多种策略。我们将详细解析默认的重定向机制,包括 LoginController 和 RedirectIfAuthenticated 中间件,并重点介绍如何通过自定义登录逻辑实现精确的重定向控制,同时提供示例代码和常见问题排查建议,确保用…

    2026年9月21日
    200
  • 小可AI小程序入口链接_小可AI小程序官方地址

    小可AI小程序官方入口为https://xcx.xiaokeai.com.cn,用户可在社交平台搜索使用;平台支持多轮对话、文本生成、图像理解及语音转文字功能,界面简洁、响应迅速,具备历史记录查看与持续优化的智能算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    100
  • Bing搜索主页官方地址_Bing搜索官方网站登录网址

    Bing搜索主页官方地址是https://www.bing.com/,页面布局简洁,顶部为搜索框,下方展示个性化信息模块,并每日更新全球高清背景图片。 Bing搜索主页官方地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Bing搜索官方网站登录网址,感兴趣的网友一起随小编来瞧瞧吧! h…

    2026年9月21日
    100
  • Bing搜索最新官方网址入口 Bing搜索在线使用官网主页直达

    Bing搜索最新官方网址入口是https://www.bing.com,该网站提供每日更新的高清背景图片、简洁的页面布局、深色模式切换及个性化主页定制等视觉体验功能。 Bing搜索最新官方网址入口在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来Bing搜索在线使用官网主页直达,感兴趣的网友…

    2026年9月21日
    200
  • poki游戏在线网站 poki热门小游戏在线畅玩

    Poki热门小游戏包括《地铁跑酷》《愤怒的小鸟经典版》《Stick先生史诗般的生存》等,涵盖动作、体育、益智等多种类型,支持网页端免下载即玩,适配多设备,无需注册即可畅玩,定期更新并设有实时热门榜单,适合各年龄段玩家在线娱乐。 Poki游戏在线网站热门小游戏有哪些?这是不少网友都关注的,接下来由PH…

    2026年9月21日
    200
  • 《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”

    《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”《哈迪斯2》95分年度必玩!外媒锐评”独立游戏崛起”

    外媒comicbook报道,2025年是游戏界的辉煌之年,多款新作在metacritic上评分突破90分,并获得“必玩”徽章。 《哈迪斯2》以95分的成绩成为本年度评分最高的游戏,强势领跑年度最佳游戏(GOTY)的激烈竞争,独立游戏的全面崛起也成为今年最瞩目的行业亮点。 《哈迪斯2》:95分封神,战…

    2026年9月21日 用户投稿
    100
  • 《最终幻想7重生》制作人力挺NS2钥匙卡!开发者受益匪浅

    《最终幻想7重生》的联合制作人滨口直树(Naoki Hamaguchi)在最近接受Wccftech采访时,对任天堂Switch 2引入的游戏钥匙卡(Game Key Card)表达了积极态度。 他不仅回应了围绕该设计的争议,还大胆预测任天堂未来将大力推动这一新格式的发展,并指出其为游戏开发团队带来的…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信