Thinkphp-商城项目之oss文件上传及web端直传

4.3头像上传

一般商城网站都会把文件上传到第三方云,例如阿里云(oss),腾讯云(cos),当然如果公司有足够的实力,可以自己部署一台文件服务器,用于文件的保存。

头像上传一般是用户在用户中心上传的,后台管理员可以编辑用户资料,其中就有头像上传,因此这个模块就先讲讲文件上传这个知识点。

源码:https://gitee.com/myha/demo-shop

4.3.1阿里云OSS

首先打开官方文档https://help.aliyun.com/zh/oss/product-overview/?spm=a2c4g.11186623.0.0.625b6f1bjn1FsU。还是按照我们之前阅读文档的重点:概述、快速开始、提供的例子

第一、购买服务

https://help.aliyun.com/zh/oss/getting-started/console-quick-start?spm=a2c4g.11186623.0.0.4d425d6bcx5NWi根据文档这一章节的步骤来

打开https://www.aliyun.com/product/oss?spm=a2c4g.11186623.J_4VYgf18xNlTAyFFbOuOQe.32.5e134425TurhoY,注册/登录阿里云账号

在这里插入图片描述

在这里插入图片描述

购买成功后我们创建一个bucket,

在这里插入图片描述

4.3.2上传实现

首先第一步就是安装

composer require aliyuncs/oss-sdk-php

接下来就把它提供的代码示例抄下来修改即可:https://help.aliyun.com/zh/oss/developer-reference/simple-upload?spm=a2c4g.11186623.0.0.6c745d6bfD4WM5

app->common->lib目录下新建oss->OSs.php

<?php
// +----------------------------------------------------------------------
// | OSS存储
// +----------------------------------------------------------------------
namespace app\common\lib\oss;

use OSS\OssClient;
use OSS\Core\OssException;
use think\facade\Log;

class Oss{

    //初始化oss客户端
    private static function createOssClient(){
        $accessKeyId = env('oss.access_key_id');
        $accessKeySecret = env('oss.access_key_secret');
        $endpoint = env('oss.endpoint');
        try {
            return new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        } catch (OssException $e) {
            Log::error("初始化oss客户端异常:".$e->getMessage());
            serviceException();
        }
    }
    
    /**
     * 上传文件
     * @param  string     $object     目标文件
     * @param  string     $filePath    源文件
     */
    public static function uploadFile($object,$filePath){
        $bucket = env('oss.bucket');
        try {
            $ossClient = self::createOssClient();
            $result = $ossClient->uploadFile($bucket, $object, $filePath);
            return $result['info'];
        }catch (OssException $e) {
            Log::error("OSS上传文件失败:".$e->getMessage());
            serviceException();
        }
    }

    /**
     * 上传文件
     * @param  string     $object     目标文件
     * @param  string     $content    字符串
     */
    public static function putFile($object,$content){
        $bucket = env('oss.bucket');
        try {
            $ossClient = self::createOssClient();
            $result = $ossClient->putObject($bucket, $object, $content);
            return $result['info'];
        }catch (OssException $e) {
            Log::error("OSS上传文件失败:".$e->getMessage());
            serviceException();
        }
    }
}

这里主要封装了两个上传方法,一个是上传文件,一个是把字符串的内容写到文件里并上传,这两种方式是很常用的,因此我这里就一并封装了。

我们上传头像是上传图片,所有等下调用的是uploadFile()方法。

这里需要注意的是

$accessKeyId = env('oss.access_key_id');
$accessKeySecret = env('oss.access_key_secret');
$endpoint = env('oss.endpoint');
// 这个我们之前创建的bucket
$bucket = env('oss.bucket');

这些配置在.env的值是怎么来的

登录控制台,这里可以获取$accessKeyId$accessKeySecret

在这里插入图片描述

还是在控制台找到菜单Bucket 列表,找到刚才我们创建的bucket,然后点击它进去,之后访问概览

在这里插入图片描述

这里要注意一下,如果你们上线的代码是部署在阿里云的话,可以选择内网访问。

在控制器app->admin->controller->User.php,新增如下方法

//上传头像
public function uploadAvatar(){
    $file = $this->request->file('file');
    $pathName = $file->getPathname();
    $originalName = $file->getOriginalExtension();

    $object = "avatar/".$file->hash('md5').".".$originalName;
    return success(Oss::uploadFile($object,$pathName));
}

然后添加路由:app->admin->route->app.php

//路由分组
Route::group('user', function(){
    //导出
    Route::get('export','user/export');
    //上传头像
    Route::post('uploadAvatar','user/uploadAvatar');
})->middleware(app\admin\middleware\Auth::class);

最后我们测试一下接口

在这里插入图片描述

4.3.3客户端直传

客户端直传指的是前端直接把文件上传到oss,就不通过后端服务了,客户端直传避免了业务服务器中转文件,提高了上传速度,节省了服务器资源 ,因此我们一般也是要求前端直传。

文档:https://help.aliyun.com/zh/oss/use-cases/client-direct-transmission-overview?spm=a2c4g.11186623.0.0.40c97b93j8YYOR

客户端直传,我们服务端唯一要做的是要提供一个临时密钥,因为$accessKeyId$accessKeySecret不能直接在前端配置,这东西绝对不能配置,因此我们在app->common->lib->oss->OSs.php后面添加一个获取临时密钥的方法

//获取临时密钥
public static function getTemKey(){
    $id = env('oss.access_key_id');
    $key = env('oss.access_key_secret');
    // $host的格式为 bucketname.endpoint,请替换为您的真实信息。
    $host = 'http://'.env('oss.bucket').env('oss.endpoint');
    // $callbackUrl为上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实URL信息。
    $callbackUrl = '';
    $dir = 'test/';          // 用户上传文件时指定的前缀。

    $callback_param = array(
        'callbackUrl' => $callbackUrl,
        'callbackBody' => 'filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}',
        'callbackBodyType' => "application/x-www-form-urlencoded"
    );
    $callback_string = json_encode($callback_param);

    $base64_callback_body = base64_encode($callback_string);
    $now = time();
    $expire = 30;  //设置该policy超时时间是10s. 即这个policy过了这个有效时间,将不能访问。
    $end = $now + $expire;
    $expiration = str_replace('+00:00', '.000Z', gmdate('c', $now));;


    //最大文件大小.用户可以自己设置
    $condition = array(0 => 'content-length-range', 1 => 0, 2 => 1048576000);
    $conditions[] = $condition;

    // 表示用户上传的数据,必须是以$dir开始,不然上传会失败,这一步不是必须项,只是为了安全起见,防止用户通过policy上传到别人的目录。
    $start = array(0 => 'starts-with', 1 => '$key', 2 => $dir);
    $conditions[] = $start;


    $arr = array('expiration' => $expiration, 'conditions' => $conditions);
    $policy = json_encode($arr);
    $base64_policy = base64_encode($policy);
    $string_to_sign = $base64_policy;
    $signature = base64_encode(hash_hmac('sha1', $string_to_sign, $key, true));

    $response = array();
    $response['accessid'] = $id;
    $response['host'] = $host;
    $response['policy'] = $base64_policy;
    $response['signature'] = $signature;
    $response['expire'] = $end;
    $response['callback'] = $base64_callback_body;
    $response['dir'] = $dir;  // 这个参数是设置用户上传文件时指定的前缀。
    return $response;
}

然后我们就可以在控制器中调用这个方法即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/168566.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolo系列模型训练数据集全流程制作方法(附数据增强代码)

yolo系列的模型在目标检测领域里面受众非常广&#xff0c;也十分流行&#xff0c;但是在使用yolo进行目标检测训练的时候&#xff0c;往往要将VOC格式的数据集转化为yolo专属的数据集&#xff0c;而yolo的训练数据集制作方法呢&#xff0c;最常见的也是有两种&#xff0c;下面我…

练习六-使用Questasim来用verilog使用function函数

[TOC](使用Questasim来用verilog使用function函数 1&#xff0c;verilog中使用函数function2&#xff0c;RTL代码3&#xff0c;测试代码4&#xff0c;输出波形 1&#xff0c;verilog中使用函数function 目的&#xff1a; &#xff08;1&#xff09;了解函数的定义和在模块设计中…

欧拉操作系统下离线安装字体的操作步骤

背景 某 Web 应用部署到欧拉操作系统后&#xff0c;应用中导出的 PDF 文件中文全部显示乱码&#xff0c;原因是字体缺失&#xff0c;但是目标系统上并没有联网&#xff0c;必须找到字体的离线安装包。 CSDN 上还有40个积分&#xff0c;下载了两个相关的资源后&#xff0c;目标…

目标检测框存在内嵌情况分析与解决

这里写目录标题 问题描述原因分析与解决方法&#xff1a;后续及思考参考文档 问题描述 目标检测模型输出的检测框存在内嵌情况。 原因分析与解决方法&#xff1a; 根据经验&#xff0c;第一感觉是后处理nms部分出了问题。来看下对应的代码&#xff1a; static float CalcIou…

GaussDB SQL基础语法示例-GOTO语句

目录 一、前言 二、在GaussDB数据库中的概念及语法 1、基本概念 2、语法 三、在GaussDB数据库中的基础示例和限制场景说明 1、基础示例 2、限制场景说明 四、小结 一、前言 SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准&#xff08;默认支持SQL2、…

新版Testwell CTC++带来哪些新变化?

Testwell CTC在版本10中引入了新的工具ctcreport来直接从符号和数据文件生成HTML报告。详细的特性描述可以在测试井CTC帮助中找到。在本文档中&#xff0c;描述了与前一代报告相比的改进和变化。 Adaptable Layout可调整布局 您可以选择一个适合于项目结构的布局。布局决定了报…

已超1000+测试员分享!Python自动化测试案例实战

随着企业对测试工程师的能力要求日渐增长&#xff0c;对我们每一位测试工程师而言既是压力也是提升的动力&#xff0c;不提升就意味着没有出路&#xff0c;没有发展&#xff01;我们职业发展的命运是靠自己的能力来把握的&#xff0c;而不是一味的惧怕高要求&#xff0c;惧怕难…

vue和uni-app的递归组件排坑

有这样一个数组数据&#xff0c;实际可能有很多级。 tree: [{id: 1,name: 1,children: [{ id: 2, name: 1-1, children: [{id: 7, name: 1-1-1,children: []}]},{ id: 3, name: 1-2 }]},{id: 4,name: 2,children: [{ id: 5, name: 2-1 },{ id: 6, name: 2-2 }]} ]要渲染为下面…

KaiwuDB 监控组件及辅助 SQL 调优介绍

一、介绍 KaiwuDB 具备完善的行为数据采集功能&#xff0c;此功能要求 KaiwuDB 数据库系统 C/E/T 端不同进程的不同维度的指标采集功能十分完善&#xff1b;在不同进程完成指标采集后&#xff0c;会通过 Opentelemetry 和 Collector 将指标存入 Prometheus&#xff0c;以便查找…

单脉冲测角-和差比幅法-方向图传播因子-函数编写

方向图传播因子-函数编写 和差比幅法单脉冲测角原理代码仿真结果参数说明 和差比幅法单脉冲测角原理 有关单脉冲测角和差比幅法的原理已经在博文单脉冲测角-和差比幅法中详细介绍了&#xff0c;我们在实际仿真的时候&#xff0c;往往需要在给定来波方向下方向图转化因子&#…

安防视频监控平台EasyCVR服务器部署后出现报错,导致无法级联到域名服务器,该如何解决?

视频监控平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;安防监控平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#xff0c;也能支持视频定时轮播。视频监控…

005 OpenCV直方图

目录 一、环境 二、直方图原理概述 三、代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、直方图原理概述 OpenCV是一个广泛使用的开源计算机视觉库&#xff0c;它提供了许多用于图像处理和分析的函数和算法。其中&#xff…

虚拟机里为什么桥接模式可以广播,NAT模式不能广播?

在虚拟机网络配置中&#xff0c;桥接模式&#xff08;Bridged mode&#xff09;允许虚拟机在与主机相同的网络上作为一个独立的设备出现。这意味着虚拟机可以接收和发送广播消息&#xff0c;就像物理机器一样&#xff0c;因为它们处于同一个物理网络上。 相反&#xff0c;NAT模…

单片非晶磁性测量系统典型磁参数的不确定度与重复性

典型磁参数的不确定度与重复性 典型的测试点 最佳不确定度 ( k 2 ) 最佳重复性 损耗Ps P1.0 ④ 3.0% 1.0% P1.3 3.0% 1.0% P1.4 3.0% 1.0% P1.5 3.0% 1.0% 磁感Bm B25 ⑤ 1.0% 0.3% B50 1.0% 0.3% B80 1.0% 0.3% 单片非晶磁性测量系统测量条件 &…

著名的勃艮第葡萄酒是如何分类的?

勃艮第代表了与他们的地理位置密切相关的所有葡萄酒和葡萄酒风格&#xff0c;1936年法国根据产地对勃艮第葡萄酒进行了分类&#xff0c;勃艮第地区内的100个被批准的葡萄酒种植区被界定&#xff0c;这些地块被分为四个等级&#xff0c;最高等级代表了种植最高品质葡萄酒的最佳土…

亚马逊防关联如何做?看这一篇就够了

我们都知道亚马逊在众多跨境电商平台里属于严格的那个&#xff0c;商家们常常调侃亚马逊死法千万种&#xff0c;但最惨的还是账户被平台关联封号。有的新手刚注册还没开始就被关联封号了&#xff0c;有的业绩不错的店铺操作没注意&#xff0c;在别的地方登录了一下就被封了&…

软件定义卫星:数字卫星实践

随着巨型低轨卫星星座、卫星互联网等计划的推进&#xff0c;近年来全球卫星产业迅速发展&#xff0c;在轨卫星呈现规模化、网络化以及智能化趋势。大规模卫星系统为飞机、船舶、车辆等提供了各种各样的天基服务&#xff0c;对国防、科研、生产生活具有重要意义。 与此同时&…

Python基础:迭代器(Iterators)详解

什么是迭代器&#xff1f; 迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问&#xff0c;直到所有的元素被访问完结束。迭代器只能往前不会后退。 1. 迭代对象 Python中使用迭代器的地方很多&#xff0c;大多数的容器对象都是可迭代对象&#xff…

Analyzing coredump file by gdb

1 coredump文件简介 在Linux中&#xff0c;当进程崩溃或异常终止时&#xff0c;系统会将进程的内存状态写入一个coredump文件中&#xff0c;这个文件包含了进程崩溃时的内存映像&#xff0c;可以用于分析进程崩溃的原因。 2 coredump文件的存储路径 执行如下指令查询coredum…

猫罐头哪个牌子质量好性价比高?推荐十款猫罐头品牌排行榜!

当前口罩形势严峻&#xff0c;海外罐头的价格飙升&#xff0c;且市场上充斥着难以辨别真伪的产品。除了海外罐头&#xff0c;您是否有其他口碑良好的国产罐头推荐&#xff1f; 作为从事了6年猫咪铲屎官的我来说&#xff0c;对于猫咪的日常饮食来源有一些经验。我也给我家的猫咪…