OSS

阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS可用于图片、音视频、日志等海量文件的存储。各种终端设备、Web网站程序、移动应用可以直接向OSS写入或读取数据。

OSS中得到相关概念

  • Endpoint:访问域名,通过该域名可以访问OSS服务的API,进行文件上传、下载等操作。
  • Bucket:存储空间,是存储对象的容器,所有存储对象都必须隶属于某个存储空间。
  • Object:对象,对象是 OSS 存储数据的基本单元,也被称为 OSS 的文件。
  • AccessKey:访问密钥,指的是访问身份验证中用到的 AccessKeyId 和 AccessKeySecret。

OSS服务端签名后前端直传的相关说明

流程介绍
  1. Web前端请求应用服务器,获取上传所需参数(如OSS的accessKeyId、policy、callback等参数)
  2. 应用服务器返回相关参数
  3. Web前端直接向OSS服务发起上传文件请求
  4. 等上传完成后OSS服务会回调应用服务器的回调接口
  5. 应用服务器返回响应给OSS服务
  6. OSS服务将应用服务器回调接口的内容返回给Web前端

整合OSS实现文件上传

一、添加依赖

        <!-- OSS SDK 相关依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.5.0</version>
</dependency>

二、修改配置文件

# OSS相关配置信息
aliyun:
oss:
endpoint: xtslife-oss.oss-cn-chengdu.aliyuncs.com # oss对外服务的访问域名
accessKeyId: test # 访问身份验证中用到用户标识
accessKeySecret: test # 用户用于加密签名字符串和oss用来验证签名字符串的密钥
bucketName: xtslife-oss # oss的存储空间
policy:
expire: 300 # 签名有效期(S)
maxSize: 10 # 上传文件大小(M)
callback: http://localhost:8080/aliyun/oss/callback # 文件上传成功后的回调地址
dir:
prefix: xtslife/images/ # 上传文件夹路径前缀

注意:注意:endpoint、accessKeyId、accessKeySecret、bucketName、callback、prefix都要改为你自己帐号OSS相关的,callback需要是公网可以访问的地址

三、添加OSS的相关java配置

package top.xtslife.practice.config;

import com.aliyun.oss.OSSClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; /**
* 用于配置OSS的连接客户端OSSClient。
* @Author 小涛
* @Create 2019-08-16 18:04
*/
@Configuration
public class OssConfig {
@Value("${aliyun.oss.endpoint}")
private String ALIYUN_OSS_ENDPOINT;
@Value("${aliyun.oss.accessKeyId}")
private String ALIYUN_OSS_ACCESSKEYID;
@Value("${aliyun.oss.accessKeySecret}")
private String ALIYUN_OSS_ACCESSKEYSECRET; @Bean
public OSSClient ossClient(){
return new OSSClient(ALIYUN_OSS_ENDPOINT,ALIYUN_OSS_ACCESSKEYID,ALIYUN_OSS_ACCESSKEYSECRET);
}
}

四、添加OSS上传策略封装对象OssPolicyResult

前端直接上传文件时所需参数,从后端返回过来。

package top.xtslife.practice.component;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data; /**
* 获取OSS上传文件授权返回结果
* @Author 小涛
* @Create 2019-08-16 19:05
*/
@Data
public class OssPolicyResult {
@ApiModelProperty("访问身份验证中用到用户标识")
private String accessKeyId;
@ApiModelProperty("用户表单上传的策略,经过base64编码过的字符串")
private String policy;
@ApiModelProperty("对policy签名后的字符串")
private String signature;
@ApiModelProperty("上传文件夹路径前缀")
private String dir;
@ApiModelProperty("oss对外服务的访问域名")
private String host;
@ApiModelProperty("上传成功后的回调设置")
private String callback;
}

五、添加OSS上传成功后的回调参数对象OssCallbackParam

当OSS上传成功后,会根据该配置参数来回调对应接口

package top.xtslife.practice.component;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data; /**
* oss上传成功后的回调参数
* @Author 小涛
* @Create 2019-08-16 19:34
*/
@Data
public class OssCallbackParam {
@ApiModelProperty("请求的回调地址")
private String callbackUrl;
@ApiModelProperty("回调是传入request中的参数")
private String callbackBody;
@ApiModelProperty("回调时传入参数格式,比如表单提交形式")
private String callbackBodyType;
}

六、OSS上传成功后的回调结果对象OssCallbackResult

回调接口中返回的数据对象,封装了上传文件的信息。

package top.xtslife.practice.component;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data; /**
* @Author 小涛
* @Create 2019-08-16 19:54
*/
@Data
public class OssCallbackResult {
@ApiModelProperty("文件名称")
private String filename;
@ApiModelProperty("文件大小")
private String size;
@ApiModelProperty("文件的mimeType")
private String mimeType;
@ApiModelProperty("图片文件的宽")
private String width;
@ApiModelProperty("图片文件的高")
private String height;
}

七、添加OSS业务接口OssService

package top.xtslife.practice.Service;

import top.xtslife.practice.component.OssCallbackResult;
import top.xtslife.practice.component.OssPolicyResult; import javax.servlet.http.HttpServletRequest; /**
* oss上传管理Service
* @Author 小涛
* @Create 2019-08-16 20:22
*/
public interface OssService {
/**
* oss 上传生成策略
* @return
*/
OssPolicyResult policy(); /**
* oss上传成功回调
* @param request
* @return
*/
OssCallbackResult callback(HttpServletRequest request);
}

八、添加OSS业务接口OssService的实现类OssServiceImpl

package top.xtslife.practice.Service.impl;

import cn.hutool.json.JSONUtil;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import top.xtslife.practice.Service.OssService;
import top.xtslife.practice.component.OssCallbackParam;
import top.xtslife.practice.component.OssCallbackResult;
import top.xtslife.practice.component.OssPolicyResult; import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date; /**
* oss上传管理Service实现类
* @Author 小涛
* @Create 2019-08-16 20:28
*/
@Service
public class OssServiceImpl implements OssService {
private static final Logger LOGGER = LoggerFactory.getLogger(OssServiceImpl.class);
@Value("${aliyun.oss.policy.expire}")
private int ALIYUN_OSS_EXPIRE;
@Value(("${aliyun.oss.maxSize}"))
private int ALIYUN_OSS_MAX_SIZE;
@Value("${aliyun.oss.callback}")
private String ALIYUN_OSS_CALLBACK;
@Value("${aliyun.oss.bucketName}")
private String ALIYUN_OSS_BUCKET_NAME;
@Value("${aliyun.oss.endpoint}")
private String ALIYUN_OSS_ENDPOINT;
@Value("${aliyun.oss.dir.prefix}")
private String ALIYUN_OSS_DIR_PREFIX; @Autowired
private OSSClient ossClient; /**
* 签名生成
* @return
*/
@Override
public OssPolicyResult policy() {
OssPolicyResult ossPolicyResult = new OssPolicyResult();
// 存储目录
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
String dir = ALIYUN_OSS_DIR_PREFIX + sdf.format(new Date());
// 签名有效期
long expireEndTime = System.currentTimeMillis() + ALIYUN_OSS_EXPIRE * 1000;
Date expiration = new Date(expireEndTime);
// 文件大小
int maxSize = ALIYUN_OSS_MAX_SIZE * 1024 * 1024;
// 回调
OssCallbackParam ossCallbackParam = new OssCallbackParam();
ossCallbackParam.setCallbackUrl(ALIYUN_OSS_CALLBACK);
ossCallbackParam.setCallbackBody("filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
ossCallbackParam.setCallbackBodyType("application/x-www-form-urlencoded");
// 提交节点
String action = "http://"+ ALIYUN_OSS_ENDPOINT;
try {
PolicyConditions policyConditions = new PolicyConditions();
policyConditions.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE,0,maxSize);
policyConditions.addConditionItem(MatchMode.StartWith,PolicyConditions.COND_KEY,dir);
String postPolicy = ossClient.generatePostPolicy(expiration,policyConditions);
byte[] binaryData = new byte[0];
binaryData = postPolicy.getBytes("utf-8");
String policy = BinaryUtil.toBase64String(binaryData);
String signature = ossClient.calculatePostSignature(postPolicy);
String callbackData = BinaryUtil.toBase64String(JSONUtil.parse(ossCallbackParam).toString().getBytes("utf-8"));
// 返回结果
ossPolicyResult.setAccessKeyId(ossClient.getCredentialsProvider().getCredentials().getAccessKeyId());
ossPolicyResult.setPolicy(policy);
ossPolicyResult.setSignature(signature);
ossPolicyResult.setDir(dir);
ossPolicyResult.setCallback(callbackData);
ossPolicyResult.setHost(action);
} catch (Exception e) {
LOGGER.error("签名生成失败",e);
}
return ossPolicyResult;
} @Override
public OssCallbackResult callback(HttpServletRequest request) {
OssCallbackResult ossCallbackResult = new OssCallbackResult();
String filename = request.getParameter("filename");
filename ="http://".concat(ALIYUN_OSS_BUCKET_NAME).concat(".").concat(ALIYUN_OSS_ENDPOINT).concat("/").concat(filename);
ossCallbackResult.setFilename(filename);
ossCallbackResult.setSize(request.getParameter("size"));
ossCallbackResult.setMimeType(request.getParameter("mimeType"));
ossCallbackResult.setWidth(request.getParameter("width"));
ossCallbackResult.setHeight(request.getParameter("height"));
return ossCallbackResult;
}
}

九、添加OssController定义接口

package top.xtslife.practice.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import top.xtslife.practice.Service.OssService;
import top.xtslife.practice.common.CommonResult;
import top.xtslife.practice.component.OssCallbackResult;
import top.xtslife.practice.component.OssPolicyResult; import javax.servlet.http.HttpServletRequest; /**
* @Author 小涛
* @Create 2019-08-16 21:46
*/
@RestController
@Api(tags = "OssController",description = "Oss管理")
@RequestMapping("/aliyun/oss")
public class OssController {
@Autowired
private OssService ossServiceImpl;
@ApiOperation("oss上传签名生成")
@GetMapping("/policy")
public CommonResult<OssPolicyResult> policy(){
OssPolicyResult ossPolicyResult = ossServiceImpl.policy();
return CommonResult.success(ossPolicyResult);
} @ApiOperation("oss上传成功回调")
@PostMapping("callback")
public CommonResult<OssCallbackResult> callback(HttpServletRequest request){
OssCallbackResult ossCallbackResult = ossServiceImpl.callback(request);
return CommonResult.success(ossCallbackResult);
}
}

springboot整合OSS实现文件上传的更多相关文章

  1. SpringBoot整合SpringMVC完成文件上传

    1.编写Controller /** * SPringBoot文件上传 */ //@Controller @RestController //表示该类下的方法的返回值会自动做json格式的转换 pub ...

  2. springboot整合ueditor实现图片上传和文件上传功能

    springboot整合ueditor实现图片上传和文件上传功能 写在前面: 在阅读本篇之前,请先按照我的这篇随笔完成对ueditor的前期配置工作: springboot+layui 整合百度富文本 ...

  3. JAVA整合阿里云OSS实现文件上传功能

    引入maven <dependency> <groupId>org.apache.commons</groupId> <artifactId>commo ...

  4. 整合MVC实现文件上传

    1.整合MVC实现文件上传整合MVC实现文件上传在实际的开发中在实现文件上传的同时肯定还有其他信息需要保存到数据库,文件上传完毕之后需要将提交的基本信息插入数据库,那么我们来实现这个操作.整个MVC实 ...

  5. Springboot 一行代码实现文件上传 20个平台!少写代码到极致

    大家好,我是小富~ 技术交流,公众号:程序员小富 又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,d ...

  6. FasfDFS整合Java实现文件上传下载

    文章目录     一 : 添加配置文件     二 : 加载配置文件         1. 测试加载配置文件         2. 输出配置文件     三:功能实现         1.初始化连接信 ...

  7. springboot实现简单的文件上传

    承接上一篇,这里记录一下简单的springboot文件上传的方式 首先,springboot简单文件上传不需要添加额外的jar包和配置 这里贴一下后端controller层的实现代码 补一份前台的HT ...

  8. 阿里云 oss 小文件上传进度显示

    对阿里云OSS上传小文件时的进度,想过两个方法:一是.通过多线程监測Inputstream剩余的字节数来计算,可是由于Inputstream在两个线程中共用,假设上传线程将Inputstream关闭, ...

  9. FasfDFS整合Java实现文件上传下载功能实例详解

    https://www.jb51.net/article/120675.htm 在上篇文章给大家介绍了FastDFS安装和配置整合Nginx-1.13.3的方法,大家可以点击查看下. 今天使用Java ...

随机推荐

  1. django-订单并发处理--悲观锁和乐观锁

    冲突比较少的时候,使用乐观锁. 冲突比较多的时候,使用悲观锁. (1)     悲观锁 select * from df_goods_sku where id=17 for update; 悲观锁获取 ...

  2. 【java】svn显示&#215;

    背景:将客服系统代码赋值到商户子系统中,复制过去后,所有代码svn显示×. 可能:代码直接复制过去只是表面上再maven中显示的代码复制过去,不是真的代码,所以对于svn来讲真的代码删了,又来了一堆新 ...

  3. java 内存日志分析

    GC日志开头的“[GC”和“[Full GC”说明了这次垃圾收集的停顿类型, 而不是用来区分新生代GC还是老年代GC的. 如果有“Full”, 说明这次GC是发生了Stop-The-World的, 例 ...

  4. 【LGR-060】洛谷10月月赛 I div.1&div.2

    Preface 一边打一边写作文打的像shit,T2失智严重特判错了233 Orz Div1 Rank2的foreverlastnig聚聚,顺便说一句显然Luogu的比赛质量比以往显著提高了啊 以下题 ...

  5. vue通过v-for渲染的列表,可以单独操作的其中的列表的两种方法

    如图,三个标题分别有多个子元素.通过点击三个标题分别控制显示和隐藏.上代码 第一种情况:点击 青1,其所有的标题下的列表全部隐藏,也就是只有一个标题的会显示子元素 <div class=&quo ...

  6. 探索ASP.Net Core 3.0系列六:ASP.NET Core 3.0新特性启动信息中的结构化日志

    前言:在本文中,我将聊聊在ASP.NET Core 3.0中细小的变化——启动时记录消息的方式进行小的更改. 现在,ASP.NET Core不再将消息直接记录到控制台,而是正确使用了logging 基 ...

  7. 动手学深度学习10- pytorch多层感知机从零实现

    多层感知机 定义模型的参数 定义激活函数 定义模型 定义损失函数 训练模型 小结 多层感知机 import torch import numpy as np import sys sys.path.a ...

  8. 五、原子操作(CAS)

    原子操作(CAS) 一.CAS(Compare And Set) ​ Compare And Set(或Compare And Swap),CAS是解决多线程并行情况下使用锁造成性能损耗的一种机制,C ...

  9. CentOS7系统yum方式安装MySQL5.7

    参考:https://www.cnblogs.com/bigbrotherer/p/7241845.html#top 1.在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要, ...

  10. C# based on PdfSharp to split pdf files and get MemoryStream C#基于PdfSharp拆分pdf,并生成MemoryStream

    install-package PdfSharp -v 1.51.5185-beta using System; using PdfSharp.Pdf; using System.IO; using ...