SpringBoot接入阿里云oss
1、pom中添加阿里云oss坐标
<?xml version="1.0" encoding="utf-8"?> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!-- 阿里云OSS -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
</dependencies>
2、定义阿里云上传(其他操作操作)结果实体
import lombok.Data; /**
* 阿里云上传结果集
*
* @author sunguoqiang
* @create 2022-07-08
*/ @Data
public class AliyunOssResult {
/**
* code:200成功
* code: 400失败
*/
private int code;
/**
* 上传成功的返回url
*/
private String url;
/**
* 提示信息
*/
private String msg;
}
3、yml设置阿里云oss参数、上传文件大小限制
aliyunOss:
endpoint: "http://oss-cn-shanghai.aliyuncs.com"
accessKeyId: "xxxxxxx"
accessKeySecret: "xxxxxxx"
bucketName: "xxxxxx"
urlPrefix: "http://bucketName.oss-cn-shanghai.aliyuncs.com/" spring:
servlet:
multipart:
max-file-size: 20MB
max-request-size: 20MB
4、阿里云oss操作工具类封装
package cc.mrbird.febs.finance.util; import cc.mrbird.febs.finance.domain.dto.AliyunOssResult;
import cc.mrbird.febs.finance.exception.FileUploadException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import java.io.*;
import java.net.URL;
import java.util.Date;
import java.util.List; /**
* @Author: sunguoqiang
* @Description: TODO
* @DateTime: 2022/8/3 16:23
**/
@Component
@Slf4j
public class AliyunOSSUtil { @Value("${aliyunOss.endpoint}")
private String endpoint;
@Value("${aliyunOss.accessKeyId}")
private String accessKeyId;
@Value("${aliyunOss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyunOss.bucketName}")
private String bucketName;
@Value("${aliyunOss.urlPrefix}")
private String urlPrefix; private OSS ossClient; /**
* 初始化OssClient
*/
@PostConstruct
public void generateOSS() {
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
if (ossClient != null) {
this.ossClient = ossClient;
} else {
log.error("OSS对象实例化失败.");
throw new RuntimeException("OSS对象实例化失败.");
}
} /**
* 判断阿里云bucket下是否存在filePath文件夹,不存在则创建
*
* @param filePath
*/
public void isExistAndCreateFolder(String filePath) {
if (!isExists(filePath)) {
boolean mkdirs = createFolder(filePath);
if (!mkdirs) {
throw new FileUploadException("附件文件夹创建失败!");
}
}
} /**
* 上传文件,以IO流方式
*
* @param inputStream 输入流
* @param objectName 唯一objectName(在oss中的文件名字)
*/
public AliyunOssResult upload(InputStream inputStream, String objectName) {
AliyunOssResult aliyunOssResult = new AliyunOssResult();
try {
// 上传内容到指定的存储空间(bucketName)并保存为指定的文件名称(objectName)。
PutObjectResult putObject = ossClient.putObject(bucketName, objectName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
aliyunOssResult.setCode(200);
aliyunOssResult.setUrl(urlPrefix + objectName);
aliyunOssResult.setMsg("上传成功");
} catch (Exception e) {
e.printStackTrace();
aliyunOssResult.setCode(400);
aliyunOssResult.setMsg("上传失败");
}
return aliyunOssResult;
} /**
* 获取oss文件
*
* @param folderName
* @return
*/
public OSSObject get(String folderName) {
OSSObject ossObject = ossClient.getObject(bucketName, folderName);
return ossObject;
} /**
* 删除OSS中的单个文件
*
* @param objectName 唯一objectName(在oss中的文件名字)
*/
public void delete(String objectName) {
try {
ossClient.deleteObject(bucketName, objectName);
// 关闭OSSClient。
ossClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 批量删除OSS中的文件
*
* @param objectNames oss中文件名list
*/
public void delete(List<String> objectNames) {
try {
// 批量删除文件。
DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(objectNames));
List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
// 关闭OSSClient。
ossClient.shutdown();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 获取文件临时url
*
* @param objectName oss中的文件名
* @param effectiveTime 有效时间(ms)
*/
public String getUrl(String objectName, long effectiveTime) {
// 设置URL过期时间
Date expiration = new Date(new Date().getTime() + effectiveTime);
GeneratePresignedUrlRequest generatePresignedUrlRequest;
generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectName);
generatePresignedUrlRequest.setExpiration(expiration);
URL url = ossClient.generatePresignedUrl(generatePresignedUrlRequest);
return url.toString();
} /**
* oss拷贝文件
*
* @param sourcePath
* @param targetPath
*/
public void copyFileSourceToTarget(String sourcePath, String targetPath) throws FileNotFoundException {
try {
CopyObjectResult copyObjectResult = ossClient.copyObject(bucketName, sourcePath, bucketName, targetPath);
} catch (Exception e) {
throw new FileUploadException("文件转移操作异常.");
}
} /**
* 根据文件路径获取输出流
*
* @param filePath
* @return
* @throws IOException
*/
public InputStream getInputStream(String filePath) throws IOException {
if (filePath == null || filePath.isEmpty()) {
log.error("方法[getInputStream]参数[filePath]不能为空.");
return null;
}
OSSObject object = ossClient.getObject(bucketName, filePath);
InputStream input = object.getObjectContent();
byte[] bytes = toByteArray(input);
return new ByteArrayInputStream(bytes);
} /**
* InputStream流转byte数组
*
* @param input
* @return
* @throws IOException
*/
private static byte[] toByteArray(InputStream input) throws IOException {
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[input.available()];
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
}
return output.toByteArray();
} /**
* 创建文件夹
*
* @param folderName
* @return
*/
private Boolean createFolder(String folderName) {
if (folderName == null || folderName.isEmpty()) {
log.error("方法[createFolder]参数[folderName]不能为空.");
return false;
}
// 防止folderName文件夹因为末尾未加【/】导致将目录当做文件创建
if (!folderName.substring(folderName.length() - 1).equals("/")) {
folderName = folderName + "/";
}
// 创建文件夹
try {
ossClient.putObject(bucketName, folderName, new ByteArrayInputStream(new byte[0]));
log.info("附件文件夹[" + folderName + "]创建成功.");
return true;
} catch (Exception e) {
log.error("附件文件夹[" + folderName + "]创建失败.");
return false;
}
} /**
* 判断文件夹是否存在
*
* @param folderName
* @return
*/
private Boolean isExists(String folderName) {
return ossClient.doesObjectExist(bucketName, folderName);
} /**
* 根据文件路径获取File
*
* @param filePath
* @return
* @throws IOException
*/
public File getFile(String filePath) throws IOException {
if (filePath == null || filePath.isEmpty()) {
log.error("方法[getFile]参数[filePath]不能为空.");
return null;
}
File file = new File(filePath);
InputStream inputStream = getInputStream(filePath);
copyInputStreamToFile(inputStream, file);
return file;
} /**
* InputStream -> File
*
* @param inputStream
* @param file
* @throws IOException
*/
private static void copyInputStreamToFile(InputStream inputStream, File file) throws IOException {
try (FileOutputStream outputStream = new FileOutputStream(file)) {
int read;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
}
} }
5、测试
import com.example.demo.util.AliyunOSSUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import java.io.IOException;
import java.util.UUID; @RestController
@RequestMapping("/file")
public class FileController { @Autowired
private AliyunOSSUtil aliyunOSSUtil; @RequestMapping(value = "/uploadFile")
public @ResponseBody Object uploadFile(@RequestParam(value = "file", required = false) MultipartFile file, String strPath) throws IOException {
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
String objectName = strPath+"/"+ UUID.randomUUID().toString()+"."+suffix;
return aliyunOSSUtil.upload(file.getInputStream(),objectName);
}
}


SpringBoot接入阿里云oss的更多相关文章
- SpringBoot整合阿里云OSS文件上传、下载、查看、删除
1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...
- SpringBoot整合阿里云OSS对象存储实现文件上传
1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...
- Java项目接入阿里云OSS存储
需求背景 目前公司内部项目所支持的文件云存储方式还是公司内部项目组提供的方案,但在时间的考验之下,弊端显现,尤其是灾备切换过程中需要切换访问地址,这种操作不方便,更可能因为中间过程的失误导致资源不可用 ...
- flutter 接入阿里云OSS
之前因为使用正常文件上传,用户多时拥堵无法正常上传,因此接入阿里OSS 来解决这个问题.本来打算整原生那块,看了下比较麻烦,用flutter dio 直接请求oss 完成 1.上传用到了image_p ...
- 阿里云 OSS+CDN
https://promotion.aliyun.com/ntms/ossedu2.html https://www.aliyun.com/act/aliyun/ossdoc.html 对象存储(Ob ...
- SpringBoot 2.0整合阿里云OSS,实现动静分离架构
前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署.博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,不过静态文件还是存储 ...
- 小白的springboot之路(十七)、阿里云OSS 的使用
0-前言 项目中,文件服务必不可少,常用的有各云服务商的OSS服务(如阿里云OSS,腾讯云OSS,七牛云).自建(fastDFS.minio): 推荐:如果用云服务的话,阿里云OSS很方便,如果自建的 ...
- Springboot项目之阿里云OSS快速入门
阿里云oss 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量.安全.低成本.高可靠的云存储服务.您可以通过本文档提供的简单的REST接口,在任何 ...
- 保姆级SpringBoot+Vue图片上传到阿里云OSS教程
小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...
- 用DzzOffice管理阿里云OSS
在DzzOffice分两种方式管理阿里云OSS 1.把阿里云oss作为多人或企业的共享网盘使用. 2.接入个人的阿里云oss管理,可同时管理多个bucket,多个bucket之间可以互传文件. 下面先 ...
随机推荐
- Educational Codeforces Round 97 (Rated for Div. 2) (A - D题个人题解)
1437A. Marketing Scheme 题意:最近猫粮店正在打折销售猫粮罐头,在给定客人能买的罐头数量区间内求合适包装大小 思路:说实话,在比赛刚开始没看懂题,最后放弃读题直接研究给出的样例解 ...
- AIO异步通信。BIO同步阻塞式IO, NIO同步非阻塞通信。
IO 什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的.单独的程序一般是让系统为它们完 ...
- P4913【黄】
这题好像可以用线段树什么的高级做法来做,但我感觉我这个简单做法不管是时间还是空间都和那些复杂的做法差不了太多.重点是很优雅,思路非常简单,而且代码很短,用OOP思想写成的代码可读性极高,不用注释估计都 ...
- Redis服务端辅助的客户端缓存机制
一.背景和问题 二.Redis6 的解决方案及原理 2.1 服务端支持客户端缓存的两种模式 1. 默认模式 2. 广播模式 2.2 客户端实现的两种连接模式 1. 使用同一连接 2. 使用不同连接 3 ...
- APB Slave状态机设计
`timescale 1ns/1ps `define DATAWIDTH 32 `define ADDRWIDTH 8 `define IDLE 2'b00 `define W_ENABLE 2'b0 ...
- 【C】C语言头文件互锁和包含问题
[来源] https://mp.weixin.qq.com/s/4tPHkwEd5n-xHNHJHtCoBw
- 处理命令行main函数args参数
引用 System.CommandLine 库(需要显示预览版才能看到) var fileOption = new Option<FileInfo?>( name: "--fil ...
- Go-GC-三色标记与混合写屏障
- 战略设计- DDD
随着系统的增长,它会变得越来越复杂,当我们无法通过分析对象来理解系统的时候,就需要掌握一些操纵和理解大模型的技术了.本文将介绍一些原则.遵循这些原则,就可以对非常复杂的领域进行建模.大部分这样的决策都 ...
- [转帖]能使 Oracle 索引失效的六大限制条件
Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反. 例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可能是 oracle 索引失效造成的.or ...