thinkphp:实现压缩文件上传、解压、文件更名、压缩包删除功能,增加trycatch

news/2025/1/20 23:36:08/

代码

public function upload_firstsure() {try {// 检查是否有文件上传if (!isset($_FILES['file']) || !is_uploaded_file($_FILES['file']['tmp_name'])) {throw new \Exception('未接收到文件或文件上传失败');}// 获取上传的文件$uploaded_file = $_FILES['file']['tmp_name'];$file_true_name = $_FILES['file']['name'];// 获取当前日期$current_date = date("Ymd");// 动态创建文件夹$user_path = $_SERVER['DOCUMENT_ROOT'] . "/uploads/firstsure/{$current_date}/";if (!file_exists($user_path)) {if (!mkdir($user_path, 0777, true)) {throw new \Exception('创建文件夹失败');}}// 生成随机文件名$random_number = mt_rand(1000000000000000, 9999999999999999); // 随机生成16位数字$new_file_name = $current_date . '_' . $random_number . '.' . pathinfo($file_true_name, PATHINFO_EXTENSION);// 文件保存路径$move_to_file = $user_path . "/" . $new_file_name;// 调用压缩图片的方法if (!$this->compress_image($uploaded_file, $move_to_file)) {throw new \Exception('压缩或保存图片失败');}// 返回成功结果return json(['code' => 1,'msg' => '上传成功','file_path' => "uploads/firstsure/{$current_date}/" . $new_file_name]);} catch (\Exception $e) {// 返回失败结果return json(['code' => 0,'msg' => $e->getMessage()]);}
}
private function compress_image($source_path, $destination_path) {try {// 设置最大文件大小为300KB$max_size = 307200;// 设置最小和最大质量$min_quality = 10;$max_quality = 90;// 获取图像信息list($width, $height, $type) = getimagesize($source_path);if (!$width || !$height) {throw new \Exception('无法获取图片信息');}// 创建图像资源switch ($type) {case IMAGETYPE_JPEG:$image = imagecreatefromjpeg($source_path);break;case IMAGETYPE_PNG:$image = imagecreatefrompng($source_path);break;case IMAGETYPE_GIF:$image = imagecreatefromgif($source_path);break;default:throw new \Exception('不支持的图片格式');}// 初始化质量$quality = $max_quality;do {// 如果是PNG或GIF,我们不调整质量if ($type == IMAGETYPE_PNG || $type == IMAGETYPE_GIF) {$success = ($type == IMAGETYPE_PNG) ? imagepng($image, $destination_path) : imagegif($image, $destination_path);$file_size = filesize($destination_path);break;}// 压缩JPEG图片并保存$success = imagejpeg($image, $destination_path, $quality);// 检查文件大小$file_size = filesize($destination_path);// 如果文件太大且质量还能降低,则降低质量再次尝试if ($file_size > $max_size && $quality > $min_quality) {$quality -= 5; // 每次减少5个点的质量以更精细地控制unlink($destination_path); // 删除之前生成的过大的图片} else {break;}} while ($quality >= $min_quality);// 清除内存中的图像资源imagedestroy($image);// 返回成功状态return $success;} catch (\Exception $e) {// 记录错误日志(可选)error_log('压缩图片失败: ' . $e->getMessage());return false;}
}

 参考

 php上传参考php:实现压缩文件上传、解压、文件更名、压缩包删除功能_php上传压缩包并解压-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_46001736/article/details/137605254?ops_request_misc=%257B%2522request%255Fid%2522%253A%25226ef920c24b1af44aaa9a421047266de2%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=6ef920c24b1af44aaa9a421047266de2&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-137605254-null-null.nonecase&utm_term=%E6%96%87%E4%BB%B6&spm=1018.2226.3001.4450

 


http://www.ppmy.cn/news/1564779.html

相关文章

计算机网络 第一章 概述 1.5

1.5 计算机网络体系结构 1.5.1 常见的三种计算机网络体系结构 为了使不同体系结构的计算机网络都能互连起来,国际标准化组织于1977年成立了专门机构研究该问题,他们提出了一个使全世界各种计算机可以互连成网的标准框架——开放系统互连基本参考模型&am…

PyTorch迁移学习与指南框架

前言: 在深度学习领域,迁移学习是一种强大的技术,它允许我们利用在大规模数据集上预训练的模型来解决数据规模较小的新任务。本文将详细介绍PyTorch框架中的迁移学习基本概念及其在计算机视觉(CV)开发中的应用。 一、…

怎样应对发现的小红书笔记详情API安全风险?

及时切断风险源 暂停 API 访问权限:一旦发现安全风险,如可疑的 API 调用行为(异常高的请求频率、来自未授权 IP 地址的访问等),首先要做的是暂停可能涉及风险的 API 访问权限。如果是通过 API 密钥进行访问控制&#x…

【遥感目标检测】【数据集】DOTA:用于航空图像中目标检测的大规模数据集

DOTA:A large-scale dataset for object detection in aerial images DOTA:用于航空图像中目标检测的大规模数据集 CVPR 2018 论文地址 数据集地址 0.论文摘要 目标检测是计算机视觉中一个重要而富有挑战性的问题。尽管过去十年见证了自然场景中目标检测的重大进展…

Sass初探:嵌套只是开始,解锁Sass更多功能

文章目录 1. 安装Sass2. Sass编译成CSS3. 设置编译后的CSS格式4. Sass和Scss有什么区别?5. Sass变量的使用6. 选择器嵌套写法7. Mixin(混合)8. extend(继承)9. Sass中的模块化(import)10. Sass中的模块化(use) 1. 安装Sass 要安装 Sass,你可以根据你的开…

二、学习SpringMVC

既然是Web框架,那么当⽤⼾在浏览器中输⼊了url之后,我们的SpringMVC项⽬就可以感知到⽤⼾ 的请求,并给予响应. 咱们学习SpringMVC,重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互. 主要分以下三个⽅⾯: 1. 建⽴连接:将⽤⼾(浏览器&#x…

Ei Scopus双检索 | 2025年第五届机器人与人工智能国际会议(JCRAI 2025)

会议简介 Brief Introduction 2025年第五届机器人与人工智能国际会议(JCRAI 2025) 会议时间:2025年7月11-13日 召开地点:中国银川 大会官网:www.jcrai.org 人工智能和机器人技术在过去几十年里得到了长足的发展,为未来的机器人应用…

uniapp button 去除边框

在找去除边框的办法时试了好久 css里设置了 border: none; /* 去掉边框 */outline: none; /* 确保点击时不出现轮廓 */压根不行,按钮还是浮在页面上有明显轮廓 最后看到了大佬的文章 https://www.cnblogs.com/menxiaojin/p/13752916.html button::after{border: no…