一、搭建OSS图床
先购买好阿里云的OSS对象存储并完成配置,可参考:阿里云OSS图床搭建教程-Luckysec
二、引入OSS依赖
在我们的SpringBoot项目中引入OSS依赖
<!-- 阿里云 OSS -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
三、配置 OSSClient
新启一个配置类,完成OSSClient的配置
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class OSSUploadConfig {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
@Value("${aliyun.oss.maxSize}")
private String maxSize;
@Value("${aliyun.oss.dir.prefix}")
private String prefix;
/**
* 连接初始化
* @return :ossClient
*/
@Bean
public OSSClient createOssClient() {
return (OSSClient) new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
@Value属性注入来自yml文件,分别对应你自己购买好的OSS对象存储服务内的信息
aliyun:
oss:
# oss对外服务的访问域名
endpoint: oss-cn-你的地域.aliyuncs.com
# 访问身份验证中用到用户标识
accessKeyId: 你的accekey
# 用户用于加密签名字符串和oss用来验证签名字符串的密钥
accessKeySecret: 你的keySecre
# oss的存储空间
bucketName: 你的bucketName
# 上传文件大小(M)
maxSize: 3
# 上传文件夹路径前缀
dir:
prefix: picture/
四、完成controller和service编写
Controller--请求方式:POST,行参:MultipartFile
Service层:
@Autowired
private OSSClient ossClient;
@Autowired
private Environment env;
/**
* 用户头像上传
* @param file:头像
* @return 图片Url
*/
@Override
public String upload(MultipartFile file) {
//1、创建oss客户端连接
String url = null;
try {
//2、获取文件输入流
InputStream inputStream = file.getInputStream();
//3、获取原始文件名
String originFileName = file.getOriginalFilename();
//4、防止文件重名
String uuidFileName = cn.hutool.core.lang.UUID.randomUUID().toString(true) + originFileName;
//4.1、精确到日
String dateTime = DateTime.now().toString("yyyy-MM-dd");
//5、拼接文件名
String realFileName = dateTime + uuidFileName ;
//拼接dir根目录
String dirFileName = env.getProperty("aliyun.oss.dir.prefix") + realFileName;
//6、创建oss请求,传入三个参数
ossClient.putObject(env.getProperty("aliyun.oss.bucketName"),dirFileName, inputStream);
//7、拼接图片url路径,方便后续入库
url = "https://" + env.getProperty("aliyun.oss.bucketName")+ "." + env.getProperty("aliyun.oss.endpoint") + "/" + dirFileName;
}catch (Exception e){
e.printStackTrace();
}finally {
//关闭client连接
ossClient.shutdown();
}
return url;
}
使用APIFOX测试一下
参数类型选择file就可以直接传输图片了
从返回结果可以看到上传成功了,返回了图片URL路径
去OSS里再看一下,图片名已经修改为:日期+UUID+originFileName,防止用户上传的图片相同,替换掉了原始图片