前置:

自行开通阿里oss服务:

https://www.aliyun.com/product/oss?spm=a2c4g.11174283.J_8058803260.125.d9387da2TjNfP6

oss API:

https://help.aliyun.com/document_detail/32013.html?spm=a2c4g.11186623.6.956.65694697WhZebu

一、简单的文件上传:

依赖:

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.10.2</version>
</dependency>

测试代码:

    @Testpublic void testOssUPLoad() throws Exception{// Endpoint以杭州为例,其它Region请按实际情况填写。String endpoint = "https://oss-cn-guangzhou.aliyuncs.com";// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。// 强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。//LTAI4GKxxxxxekn2ZYLxab//9XnhRAnlxxxxxxTDMLpMxGLoQx6rString accessKeyId = "LTAI4GKxxxxxekn2ZYLxab";String accessKeySecret = "9XnhRAnlxxxxxxTDMLpMxGLoQx6r";String bucketName = "xxxx-oos-images";// <yourObjectName>上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。String objectName = "C:\\Users\\Administrator\\Downloads\\6555c4f8ffa80914bc51b798e4a6dce6.jpeg";// 创建OSSClient实例。OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);//以每天一个文件夹保存上传的文件(文件名称自行优化)String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String content = format+"/Hello OSS.jpeg";// 上传文件到指定的存储空间(bucketName)并将其保存为指定的文件名称(objectName)。ossClient.putObject(bucketName, content, new FileInputStream(objectName));// 关闭OSSClient。ossClient.shutdown();}

二、使用spring-cloud-starter-alicloud-oss对文件直传进行改善

 2.1、starter用2.2.0RELEASE 如果使用依赖管理的默认2.2.3RELEASE则无法启动

        <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.2.0.RELEASE</version></dependency>

如果上边的starter依赖有冲突(启动失败)可以使用下边的依赖替换上边的依赖试试:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>aliyun-oss-spring-boot-starter</artifactId><version>1.0.0</version><exclusions><exclusion><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-oss</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.5.7</version>
</dependency>

补充:项目使用的版本如下:(没有版本问题可不看)

    //1.spring boot 版本<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent>//2、spring cloud 以及spring cloud alibaba 版本,版本可以在properties里标注也直接在 //dependencyManagement 表明<properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR8</spring-cloud.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.3.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

2.2、配置OSS

spring:application:name: xxxxcloud:nacos:discovery:server-addr: 127.0.0.1:8848alicloud:access-key: LTAI4GKzxxxxekn2ZYLxabsecret-key: 9XnhRAxxxxxxxxxxxxxxxxxxLpMxGLoQx6ross:endpoint: xxxxxxxxxxxxxxxxxxxxxxxx
server:port: 30000

2.3、测试

    //注入OSSClient@AutowiredOSSClient ossClient;@Testvoid contextLoads() throws Exception {String objectName =     "C:\\Users\\Administrator\\Downloads\\6555c4f8ffa80914bc51b798e4a6dce6.jpeg";String bucketName = "xxx-oss-images";String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String content = format+"/ss335OSS.jpeg";ossClient.putObject(bucketName, content, new FileInputStream(objectName));// 关闭OSSClient。ossClient.shutdown();}}

三、服务端签名后直传

阿里文档:

https://help.aliyun.com/document_detail/31926.html?spm=a2c4g.11186623.6.1738.442534f3qJ9Nb7

1、依赖(依赖版本同上 二)

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alicloud-oss</artifactId><version>2.2.0.RELEASE</version></dependency>

2、配置

spring:cloud:alicloud:access-key: LTAI4xxxxxxxZYLxabsecret-key: 9XnxxxxxxxxxxxxxxxxxxxxxGLoQx6ross:endpoint: xxxxxxxxxxxxxxxxxxxxxx## 自定义添加的属性bucket: mybucket

2、代码

@RestController
@RequestMapping("thirdparty/oss")
public class OSSController {@AutowiredOSS ossClient;//这里不能写OSSClient,因为容器总注入的是OSS,而不是其OSSClient实现,可以参看OssContextAutoConfiguration@Value("${spring.cloud.alicloud.oss.endpoint}")private String endpoint;@Value("${spring.cloud.alicloud.oss.bucket}")private String bucket;@Value("${spring.cloud.alicloud.access-key}")private String accessId;@RequestMapping("/policy")public R ossUpload() {// host的格式为 bucketname.endpointString host = "https://" + bucket + "." + endpoint;// callbackUrl为 上传回调服务器的URL,请将下面的IP和Port配置为您自己的真实信息。String callbackUrl = "http://88.88.88.88:8888";String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());String dir = format + "/"; // 用户上传文件时指定的前缀。Map<String, String> respMap = null;try {//有效期long expireTime = 30;long expireEndTime = System.currentTimeMillis() + expireTime * 1000;Date expiration = new Date(expireEndTime);// PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes("utf-8");String encodedPolicy = BinaryUtil.toBase64String(binaryData);String postSignature = ossClient.calculatePostSignature(postPolicy);respMap = new LinkedHashMap<String, String>();respMap.put("accessid", accessId);respMap.put("policy", encodedPolicy);//经过加密的访问策略respMap.put("signature", postSignature);//阿里oss服务提供的签名respMap.put("dir", dir);//文件将要保存的地址respMap.put("host", host);//文件提交的地址respMap.put("expire", String.valueOf(expireEndTime / 1000));//签名有效期// respMap.put("expire", formatISO8601Date(expiration));} catch (Exception e) {// Assert.fail(e.getMessage());System.out.println(e.getMessage());} finally {ossClient.shutdown();return R.ok().put("data", respMap);}}}

到这里可以使用idea自带的REST client 先测试后端是否可以正常获取到签名。

获取到的信息如下:

3、前端代码或者参考阿里提供的原生客户端:(https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/86983/APP_zh/1537971352825/aliyun-oss-appserver-js-master.zip?spm=a2c4g.11186623.2.10.74c47403C0rJnK&file=aliyun-oss-appserver-js-master.zip)

3.1异步获取签名

src/components/upload/policy.js文件如下:这里对异步方法axios进行了封装(自行使用原生axios或者ajax进行替换即可)

import http from '@/utils/httpRequest.js'
export function policy() {return  new Promise((resolve,reject)=>{http({url: http.adornUrl("/thirdparty/oss/policy"),method: "get",params: http.adornParams({})}).then(({ data }) => {resolve(data);})});
}

3.2vue+element组件提供的上传组件

src/components/upload/singleUpload.vue文件如下

<template> <div><el-uploadaction="https://xxxxxx这里填 阿里oss提供 Bucket域名":data="dataObj"list-type="picture":multiple="false" :show-file-list="showFileList":file-list="fileList":before-upload="beforeUpload":on-remove="handleRemove":on-success="handleUploadSuccess":on-error="handleUploadFail":on-preview="handlePreview"><el-button size="small" type="primary">点击上传</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过10MB</div></el-upload><!-- file-list上传的文件列表, 例如: [{name: 'food.jpg', url: 'https://xxx.cdn.com/xxx.jpg'}] --><el-dialog :visible.sync="dialogVisible"><img width="100%" :src="fileList[0].url" alt=""></el-dialog></div>
</template>
<script>import {policy} from './policy'import { getUUID } from '@/utils'//uuid,随便自定义即可export default {name: 'singleUpload',props: {value: String},computed: {imageUrl() {return this.value;},imageName() {if (this.value != null && this.value !== '') {return this.value.substr(this.value.lastIndexOf("/") + 1);} else {return null;}},fileList() {return [{name: this.imageName,url: this.imageUrl}]},showFileList: {get: function () {return this.value !== null && this.value !== ''&& this.value!==undefined;},set: function (newValue) {}}},data() {return {dataObj: {policy: '',signature: '',key: '',ossaccessKeyId: '',dir: '',host: '',// callback:'',},dialogVisible: false};},methods: {handleUploadFail(){console.log("文件上传失败!!");},emitInput(val) {//this.$emit('input', val) 的意思是出发input事件(自定义事件也可以),val为input事件的参数this.$emit('input', val)},handleRemove(file, fileList) {this.emitInput('');},handlePreview(file) {this.dialogVisible = true;},//上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。beforeUpload(file) {console.log(`文件详情:`,file);let _self = this;return new Promise((resolve, reject) => {policy().then(response => {_self.dataObj.policy = response.data.policy;_self.dataObj.signature = response.data.signature;_self.dataObj.ossaccessKeyId = response.data.accessid;_self.dataObj.key = response.data.dir + getUUID()+'_${filename}';//_self.dataObj.key = response.data.dir + getUUID()+file.name;//这样也是可以的_self.dataObj.dir = response.data.dir;_self.dataObj.host = response.data.host;resolve(true)}).catch(err => {reject(false)})})},handleUploadSuccess(res, file) {//此代码用于文件上传完毕后,返回图片地址给//<single-upload v-model="dataForm.logo"></single-upload>console.log("上传成功...")this.showFileList = true;this.fileList.pop();//pop() 方法用于删除并返回数组的最后一个元素,如果只有一个元素就是清空操作了this.fileList.push({name: file.name, url: this.dataObj.host + '/' + this.dataObj.key.replace("${filename}",file.name) });this.emitInput(this.fileList[0].url);}}}
</script>
<style></style>

3.3 测试组件test.vue

<template><!-- 使用单文件上传组件 --><single-upload v-model="image"></single-upload>
</template><script>
import SingleUpload from "@/components/upload/singleUpload";
export default {data() {return {};},components: {SingleUpload,},
}</script>

阿里云oss文件上传(简单上传、服务端签名后直传)相关推荐

  1. oss服务端签名后直传分析与代码实现

    文章目录 1.简介 1.1 普通上传方式 1.2 服务端签名后直传 3.服务端签名后直传文档 3.1 用户向应用服务器请求上传Policy和回调. 3.2 应用服务器返回上传Policy和签名给用户. ...

  2. 商城项目09_品牌管理菜单、快速显示开关、阿里云进行文件上传、结合Alibaba管理OSS、服务端签名后直传

    文章目录 ①. 品牌管理菜单 ②. 快速显示开关 ③. 阿里云上传概述 ④. 使用代码进行文件上传 ⑤. 结合Alibaba来管理oss ⑥. gulimall-third-party微服务 ⑦. 服 ...

  3. 分布式电商项目二十六:使用阿里云存储的服务端签名后直传(前端联调)

    使用阿里云存储的服务端签名后直传(前端联调) 在前端显示上传的界面,可以根据人人fast-vue的结构,在src\components目录下添加upload文件夹,直接添加vue组件即可,总计三个组件 ...

  4. 阿里云OSS域名配置及简单上传

    目前开发系统,附件文件一般都会使用第三方的存储空间来保存,一方面是为了开发者提供便利,另一方可以减轻系统的访问压力,下面介绍一下阿里云的OSS的一些简单配置和使用. 一.阿里云OSS配置 前提:你需要 ...

  5. 【OSS】服务端签名后直传实现阿里云存储上传文件

    文章目录 1.前言 2.阿里云OSS 2.1.开通服务 2.2.创建Bucket 2.3.创建子账户 3.服务端 3.1.依赖导入 3.2.配置文件 3.3.控制器编写 3.4.接口测试 4.前端联调 ...

  6. java oss 批量传输_阿里云OSS对象存储,服务端签名后直传阿里云OSS

    继续上一章文章,这次要操作的是,浏览器请求服务要到签名后直传给OSS对象存储. 1.写好服务端的方法,传给前台相应的密钥 @Resource OSSClient ossClient; @Value(& ...

  7. 阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)

    分片上传(结合element-ui的upload组件实现自定义上传) async uploadFree(content){let data = await this.getOssToken(); // ...

  8. 实现阿里云OSS文件上传

    1.开通服务并获取配置 通过 对象存储OSS 购买服务后 ,该步骤主要配置 region.bucket ,再通过 AccessKey管理 获取到服务 accessKeyId.accessKeySecr ...

  9. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    SpringBoot整合阿里云OSS文件上传.下载.查看.删除 该项目源码地址:https://github.com/ggb2312/springboot-integration-examples ( ...

最新文章

  1. Android面试题收集
  2. 深入理解groupByKey、reduceByKey区别——本质就是一个local machine的reduce操作
  3. spring事件通知机制详解
  4. 【JavaScript】JS的变量、数组、计算器案例、函数、类、常用对象的方法
  5. 下一代云原生应用制品管理平台,容器镜像服务企业版优惠进行时
  6. 2.2 获取图像感兴趣区域_基于Hu距的图像旋转矫正之OpenCV实现
  7. 关于stack 和heap
  8. 【白皮书分享】2020中国人工智能API经济白皮书.pdf(附下载链接)
  9. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)
  10. 敏捷团队章程-让团队持续敏捷
  11. 主动降噪技术matlab,主动降噪技术(ANC)的前生今世--原理仿真
  12. 沧海一声笑计算机版本,各个版本的《沧海一声笑》,古韵十足
  13. 基于smart_rtmp直播,最简单的部署手册
  14. c语言引用性间接变量,c语言取地址和间接引用
  15. 六个好用的前端开发在线工具
  16. 京沪深仍为经济发展水平最高的城市,平均薪酬增长率均在7%以上
  17. 地心坐标系转地理坐标系(NED)
  18. 2019年总结和展望
  19. 全志 A50/A133 新增驱动配置
  20. 重建大师6.0多源通吃!卫星建模、下视影像三维建模、点云融合建模...

热门文章

  1. eos bp节点 超级节点搭建
  2. java虚数复数计算_真实的虚数,不仅不是没用,而且还很实在
  3. Delphi2010设置成Delphi7风格
  4. 如何查看网站的收录与排名
  5. EasyExcel基本教程
  6. win8.1 如何查看com端口号
  7. 如何实现从M个数字选取N个数字排列算法
  8. H3C R390 G2 服务器重装系统
  9. 蓝图(Blueprint)理解
  10. SpringFramework教程