thinkphp6入门(20)-- 如何上传图片、文件

  1. 配置文件

设置上传的路径

对应文件夹

  1. 前端
html 复制代码
<div class="card-body">
            <h1 class="card-title">用户头像</h1>
            <img src="../../../uploads/{$user.avatar_photo_path}" alt="avatar"  height="100"/>
            <form class="forms-sample" action="保存路径" method="post" enctype="multipart/form-data">
              选择图片(最大0.5M,格式jpg,jpeg,png):<input type="file" name="user_avatar_image"/>              
              <button type="submit" class="btn btn-primary mr-2">上传</button>
            </form>
</div>
  1. 后端
php 复制代码
  /**
     * 保存用户头像
     */
    function do_save_user_avatar()
{

        // 字段名
        $field_name = 'user_avatar_image';

        if(request()->isPost()){
            

            try {
            
                // 获取表单上传文件 例如上传了001.jpg
                $file = request()->file($field_name);
            
                // 使用验证器验证上传的文件
                validate(['file' => [
                    // 限制文件大小(单位b),这里限制为1M
                    'fileSize' => 0.5 * 1024 * 1024,
                    // 限制文件后缀,多个后缀以英文逗号分割
                    'fileExt'  => 'jpg,jpeg,png'
                ]])->check(['file' => $file]);
            
                // 上传到本地服务器
                // public/uploads文件夹下的profile文件夹
                $save_name = \think\facade\Filesystem::disk('public')->putFile('profile', $file);

                if($save_name){

                    // 要更新的数据库
                    // 
                    
                    // 上传之后的操作
                    return  $this->success('上传成功', '跳转路径');
                    
                }

            } 
            catch (\Throwable $e) {
                return $this->error('上传图片失败,' . $e->getMessage());
            }

        }
        
    }

注意:try catch中捕捉错误,是\Throwable $e

也可单独封装出一个上传文件的函数,包含压缩图片

php 复制代码
// 需要安装composer require topthink/think-image
/**
 * 上传文件
 * $field_name = 'user_avatar_image';
 * $subdirectory public下的哪个子目录
 * $fileSize = 0.5 (单位为M)
 * $compressionRatio = 0.8 压缩成原来的80%
 * $fileExt 文件格式字符串
 * $is_image_thumb = 0, 图片是否压缩
 * $thumb_threshold = 0.5, 图片的size大于多少才压缩,单位M
 * $thumb_width = 500, 压缩的宽
 * $thumb_height = 500,  压缩的高
 */
function uploadFile($field_name, $subDirectory, $fileSize = 1, $fileExt = 'jpg,jpeg,png', $is_image_thumb = 0, $thumb_threshold = 0.5, $thumb_width = 500, $thumb_height = 500)
{
    // 获取表单上传文件 例如字段名是'user_avatar_image'
    if(!array_key_exists($field_name, $_FILES))
    {
        $response = [];
        $response['code'] = 100;
        $response['msg'] = 'FILES中不存在该变量';
        $response['data'] = [];
        return  $response;
    }
    else
    {   
        // 变量'user_avatar_image'没有值
        if($_FILES[$field_name]['error'] != 0){
            $response = [];
            $response['code'] = 200;
            $response['msg'] = '没有上传文件';
            $response['data'] = [];
            return  $response;
        }
    }

    if(request()->isPost()){

        try {

            // 获取表单上传文件 例如上传了001.jpg
            $file = request()->file($field_name);

            // 使用验证器验证上传的文件
            validate(['file' => [
                // 限制文件大小(单位b),这里限制为1M
                'fileSize' => $fileSize * 1024 * 1024,
                // 限制文件后缀,多个后缀以英文逗号分割
                'fileExt'  => $fileExt
            ]])->check(['file' => $file]);

            // 上传到本地服务器
            // uploads文件夹下的profile文件夹
            
            $save_name = '';
            
            // 是否需要压缩
            if($is_image_thumb == 0 || $file->getSize() < $thumb_threshold * 1024 * 1024)
            {
                // 路径有日期文件夹
                $save_name = \think\facade\Filesystem::disk('public')->putFile($subDirectory, $file);
            }
            else
            {
                // 获取上传的图片,进行图片压缩
                $image = \think\Image::open($file);
                // 保存图片的路径处理
                $date = date('Ymd');
                $save_name = public_path() . 'uploads/' . $subDirectory . '/' . $date . '_' . $file->md5() . '.jpg';
                // 保存
                // 默认会按比例保存,但是最大宽度、高度不超过thumb(400, 400)设定值
                $img_edit = $image->thumb($thumb_width, $thumb_height)->save($save_name);
            }
            

            if($save_name){
                $response = [];
                $response['code'] = 1;
                $response['msg'] = '上传成功';
                $response['data']['save_name'] = $save_name;
                return $response;
            }

        } 
        catch (\Throwable $e) {
            $response = [];
            $response['code'] = 300;
            $response['msg'] = '上传失败,' . $e->getMessage();
            $response['data'] = [];
            return $response;
        }

    }

    $response = [];
    $response['code'] = 400;
    $response['msg'] = '上传失败,非POST请求';
    $response['data'] = [];
    return $response;
    
}

上传成功之后,如图

by 软件工程小施同学

相关推荐
百事老饼干9 分钟前
Java[面试题]-真实面试
java·开发语言·面试
杨荧1 小时前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
白子寰1 小时前
【C++打怪之路Lv14】- “多态“篇
开发语言·c++
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。1 小时前
c++多线程
java·开发语言
小政爱学习!1 小时前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
k09331 小时前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯2 小时前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue2 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧2 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv