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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件需求的三大层次,逐层细化的注意事项

需求逐层分解和转化是一个持续优化的过程&#xff0c;在这个过程中&#xff0c;我们需要明确软件需求的三大层次&#xff0c;从而帮助项目团队理解组织或客户的高层目标和期望&#xff0c;满足用户的期望和需求&#xff0c;有助于产品的系统设计和开发。 一、软件需求三大层次 …

坑惨啦!!!——符号冲突案例分析

背景 前段时间在北汽项目中&#xff0c;遇到了一个奇怪现象&#xff1a;程序启动之后&#xff0c;偶现运行一段时间后&#xff0c;crash&#xff0c;复现频率较高。困扰了大家较长时间。最终在和同事的不懈努力下&#xff0c;找到的根因&#xff0c;并找到了解决方法。过程中也…

影视行业如何远程完整快速传输大文件?

影视行业是一个充满创意和协作的领域。在影视制作中&#xff0c;涉及到多个环节和部门&#xff0c;包括编剧、导演、摄影、剪辑、配音、视效等。这些环节和部门通常分布在不同的地点&#xff0c;甚至不同的国家。因此&#xff0c;影视制作过程中需要频繁进行远程传输&#xff0…

科技赋能,创新发展!英码科技受邀参加2023中国创新创业成果交易会

11月17日至19日&#xff0c;2023中国创新创业成果交易会&#xff08;简称&#xff1a;创交会&#xff09;在广州市广交会展馆圆满举行。英码科技受邀参加本届创交会&#xff0c;并在会场展示了创新性的AIoT产品、深元AI引擎和行业热门解决方案。 据介绍&#xff0c;本届创交会由…

vscode编写verilog的插件【对齐、自动生成testbench文件】

vscode编写verilog的插件&#xff1a; 插件名称&#xff1a;verilog_testbench,用于自动生成激励文件 安装教程&#xff1a;基于VS Code的Testbench文件自动生成方法——基于VS Code的Verilog编写环境搭建SP_哔哩哔哩_bilibili 优化的方法&#xff1a;https://blog.csdn.net…

CMake 判断操作系统类型

上回的CMakeLists.txt里面有一句,if (WIN32)......endif(WIN32); 根据资料,这是判断操作系统是否是Windows; 下面单独看一下; 一个CMakeLists.txt文件如下; if(WIN32)# 如果是 Windowsmessage("当前操作系统为 Windows") elseif(UNIX AND NOT APPLE)# 如果…

Go 语言学习:了解 const 关键字及常量声明

如果一个变量应该有一个固定的、不能改变的值&#xff0c;你可以使用const关键字。 const关键字将变量声明为"常量"&#xff0c;这意味着它是不可改变和只读的。 语法 const CONSTNAME type value 声明常量 声明常量的示例&#xff1a; package main import (…

【MATLAB基础绘图第17棒】绘制玫瑰图

MATLAB绘制玫瑰图 玫瑰图&#xff08;Nightingale Rose Chart&#xff09;风玫瑰图&#xff08;WindRose&#xff09;准备工作&#xff1a;WindRose工具包下载案例案例1&#xff1a;基础绘图 参考 玫瑰图&#xff08;Nightingale Rose Chart&#xff09; 玫瑰图&#xff08;Ni…

Java_异常详解

前言 异常是什么,异常如何抛出,如何抛出自定义异常,异常处理主要的五个关键字&#xff1a;throw,try,catch,finally,throws ,异常的处理流程 异常是什么 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1. 算数异…

app小程序定制开发的优势|企业软件网站建设

app小程序定制开发的优势|企业软件网站建设 小程序定制开发是目前互联网行业中备受关注的领域之一。随着智能手机的普及和移动互联网的迅猛发展&#xff0c;越来越多的企业和个人开始重视小程序的潜力&#xff0c;并积极寻求定制开发的服务。那么&#xff0c;为什么小程序定制开…

php字符串处理函数的使用

php字符串处理函数的使用 trim() trim()函数的功能用于去除字符串首尾的空白字符(包括空格、制表符、换行符等&#xff09;。它可以用于清理用户输入的数据或去除字符串中的多余空格。 <?php $char" holle world! ";echo trim($char) ?>str_repl…

【LeetCode】104. 二叉树的最大深度

104. 二叉树的最大深度 难度&#xff1a;简单 题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 …

JVM--Java虚拟机

0. java代码的执行过程 了解Java虚拟机&#xff08;JVM&#xff09;首先需要了解一下一段Java代码的具体执行过程。 Java代码的具体执行过程如下&#xff1a; 执行 javac 命令编译源代码为字节码执行 java 命令&#xff0c;二进制字节码通过解释器翻译为机器码 创建 JVM&…

通过css设置元素隐藏和显示

背景&#xff1a;鼠标悬浮时显示删除&#xff0c;放开后显示组件名 解决&#xff1a;通过display:none和display:block显示和隐藏元素&#xff1b; 使用 div p选择器选择当前div的下一个紧跟的p元素 <div v-if"!preview" class"name">{{propertyDa…

(数据库管理系统)DBMS与(数据库系统)DBS的区别

数据库管理系统&#xff08;DBMS&#xff0c;Database Management System&#xff09;和数据库系统&#xff08;DBS&#xff0c;Database System&#xff09;是两个相关但不同的概念。 DBS是一个更广泛的概念&#xff0c;指的是计算机系统引入数据库后的系统&#xff0c;包括数…

Spring接入Metric+Graphite+Grafana搭建监控系统

环境搭建 Metric 主要是记录操作记录&#xff0c;把数据传给Graphite&#xff0c;这个只需要引入依赖就可以了 日志收集系统&#xff0c;可以支持很多的监控系统一般在Spring项目中用其收集数据&#xff0c;可以发送到Graphite等监控系统中一般使用Merter和Timer分别记录成功…

C# 图解教程 第5版 —— 第15章 事件

文章目录 15.1 发布者和订阅者15.2 源代码组件概览15.3 声明事件15.4 订阅事件15.5 触发事件15.6 标准事件的用法15.6.1 通过扩展 EventArgs 来传递数据15.6.2 移除事件处理程序 15.7 事件访问器 15.1 发布者和订阅者 ​ 发布者 / 订阅者模式&#xff1a;发布者定义了一系列事…

Lifecyle的原理

1、Lifecycle是典型的观察者模式&#xff0c;被观察者的继承关系如上图所示。 2、LifeCycleRegistry是Lifecycle的子类。 3、观察者通过LifeCycle对象的addObserver注册监听生命周期的变化&#xff0c;通过removeObserver移除监听生命周期的变化。 4、Activity或Fragment的生命…

【MATLAB源码-第84期】基于matlab的802.11a标准的OFDM系统误码仿真对比QPSK,16QAM。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于802.11a标准的OFDM&#xff08;正交频分复用&#xff09;系统是一种高效的无线通信技术&#xff0c;特点如下&#xff1a; 频带与信道&#xff1a; 802.11a工作在5 GHz频段&#xff0c;这个频段相对于2.4 GHz&#xff08…

目标检测 详解SSD原理,数据处理与复现

原理详解 前言 今天我们要读的这篇VGGNet&#xff08;《Very Deep Convolutional Networks For Large-Scale Image Recognition》&#xff09;&#xff0c;就是在AlexNet基础上对深度对网络性能的影响做了进一步的探索。它是ImageNet 2014年亚军&#xff0c;相比于AlexNet&am…