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的更多相关文章

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

    1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...

  2. SpringBoot整合阿里云OSS对象存储实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...

  3. Java项目接入阿里云OSS存储

    需求背景 目前公司内部项目所支持的文件云存储方式还是公司内部项目组提供的方案,但在时间的考验之下,弊端显现,尤其是灾备切换过程中需要切换访问地址,这种操作不方便,更可能因为中间过程的失误导致资源不可用 ...

  4. flutter 接入阿里云OSS

    之前因为使用正常文件上传,用户多时拥堵无法正常上传,因此接入阿里OSS 来解决这个问题.本来打算整原生那块,看了下比较麻烦,用flutter dio 直接请求oss 完成 1.上传用到了image_p ...

  5. 阿里云 OSS+CDN

    https://promotion.aliyun.com/ntms/ossedu2.html https://www.aliyun.com/act/aliyun/ossdoc.html 对象存储(Ob ...

  6. SpringBoot 2.0整合阿里云OSS,实现动静分离架构

    前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署.博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,不过静态文件还是存储 ...

  7. 小白的springboot之路(十七)、阿里云OSS 的使用

    0-前言 项目中,文件服务必不可少,常用的有各云服务商的OSS服务(如阿里云OSS,腾讯云OSS,七牛云).自建(fastDFS.minio): 推荐:如果用云服务的话,阿里云OSS很方便,如果自建的 ...

  8. Springboot项目之阿里云OSS快速入门

    阿里云oss 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量.安全.低成本.高可靠的云存储服务.您可以通过本文档提供的简单的REST接口,在任何 ...

  9. 保姆级SpringBoot+Vue图片上传到阿里云OSS教程

    小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...

  10. 用DzzOffice管理阿里云OSS

    在DzzOffice分两种方式管理阿里云OSS 1.把阿里云oss作为多人或企业的共享网盘使用. 2.接入个人的阿里云oss管理,可同时管理多个bucket,多个bucket之间可以互传文件. 下面先 ...

随机推荐

  1. CPP-移动语义

    "Move semantics allows us to optimize the copying of objects, where we no longer need the value ...

  2. Codeforces Round #732 (Div. 2) A ~ D 个人题解记录

    比赛链接:Here 1546A - AquaMoon and Two Arrays 选定两个数组元素执行以下操作: \(a_i,a_j (1\le i,j \le n)\) 一个 +1 另一个 -1, ...

  3. Educational Codeforces Round 6 620E. New Year Tree(DFS序+线段树)

    题目链接:点击打开链接 题意:给你一棵树,编号1~n,告诉你根结点是1. 每次有两个操作: 1,将以v为根的子树的结点全部染成颜色c 2,问以v为根的紫书的结点的颜色种类. 思路:如果这是一条线段的话 ...

  4. 技术分享 | 不同格式标准SBOM清单横评:SPDX、CDX和DSDX

    为了保证安全性.降低开发.采购及维护的相关成本,复杂动态的现代软件供应链对软件资产透明度提出了更高的要求.使用清晰的软件物料清单(SBOM)收集和共享信息,并在此基础上进行漏洞.许可证和授权管理等,可 ...

  5. 6 Englishi 词根

    9 pend/pends = hang 悬挂 depend   de 向下 independent   in 前缀 表否定: ent  adj后缀 suspend    sus=sub(便于发音) p ...

  6. java基础-反射-day15

    目录 1. 案例引入 2. Class 的理解 3. 反射的详细使用 4. Class 类都有哪些实例 5. 详细使用 6. 获取属性 7. 获取方法 8 获取类的 接口 注解 所在的包 9. 思考 ...

  7. 基于AHB_BUS SRAM控制器的设计-01

    基于AHB Bus SRAM控制器的设计 1.课程目标 接到一个需求要设计SRAM或者I-cache等,需要问后端要一个Memory Memory Compiler是由后端工程师完成的,Memory ...

  8. ASR6505是基于STM 8位MCU的无线通信芯片组

    ASR6505是基于STM 8位MCU的无线通信芯片组 ASR6505是一种通用的LoRa无线通信芯片组,集成了LoRa无线电收发器.LoRa调制解调器和一个8位CISC MCU ASR6505是基于 ...

  9. [转帖]解决Harbor在服务器重启后无法自启动的问题

    问题 当部署Harbor的服务器在重启之后,可能会出现Harbor无法跟随系统自启动 解决方案 现假设Harbor的安装目录位置为/usr/local/harbor,在Harbor安装完成之后,在此目 ...

  10. [转帖]SQL中 join 、in 、exists 使用场景和执行效率

    https://www.jianshu.com/p/c825c9bf42c2 众所周知,在sql 中,join /in /exists 都可以用来实现,"查询A表中在(或者不在)B表中的记录 ...