当前位置: 首页 > article >正文

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

代码

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.kler.cn/a/507832.html

相关文章:

  • 联通用户管理系统(一)
  • 在Playwright中使用PO模式
  • 关于 Cursor 的一些学习记录
  • Kotlin 协程基础十 —— 协作、互斥锁与共享变量
  • nginx 修改内置 404 页面、点击劫持攻击。
  • 摄像头模块在狩猎相机中的应用
  • MyBatis基于XML的详细使用-缓存
  • 用户中心项目教程(一)--Ant design pro初始化的学习和使用
  • 什么是.NET中的反射,它有哪些应用场景
  • 包装类和简单认识泛型
  • RPA赋能内容创作:打造小红书入门词语图片的全自动化流程
  • 【Python】深入探讨Python中的单例模式:元类与装饰器实现方式分析与代码示例
  • 【Mysql进阶知识】Mysql 程序的介绍、选项在命令行配置文件的使用、选项在配置文件中的语法
  • 甲骨实物高保真数据归国,AI助力古文释读,发现甲骨新图像
  • python(25) : 含有大模型生成的公式的文本渲染成图片并生成word文档(支持flask接口调用)
  • Linux 35.6 + JetPack v5.1.4之 pyCUDA升级
  • OpenAI与Axios合作扩展新闻行业AI应用
  • 设计模式(4)行为模式
  • 正则表达式 匹配特定字符后的所有字符
  • SSE 实践:用 Vue 和 Spring Boot 实现实时数据传输
  • GORM(Go语言数据交互库)
  • Java ArrayList
  • Angular 19 新增的一些核心功能
  • 从零开始启动一个Vue项目
  • JavaSE第八天
  • 软件工程师欧以宁:引领无人机导航与物联网安全的技术革新