SpringBoot( 上传图片至阿里云图床 )
一、搭建OSS图床
先购买好阿里云的OSS对象存储并完成配置,可参考:
二、引入OSS依赖
在我们的SpringBoot项目中引入OSS依赖
<!-- 阿里云 OSS --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency>
三、配置 OSSClient
新启一个配置类,完成OSSClient的配置
package com.brrbaii.config; 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.stereotype.Component; @Data @Component 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层:
/** * 用户头像上传 * @param file:头像 * @return 图片Url */ @Override public String upload(MultipartFile file) { //1、创建oss客户端连接 OSSClient ossClient = ossUploadConfig.createOssClient(); String url = null; try { //2、获取文件输入流 InputStream inputStream = file.getInputStream(); //3、获取原始文件名 String originFileName = file.getOriginalFilename(); //4、防止文件重名 String uuidFileName = UUID.randomUUID().toString(true) + originFileName; //4.1、精确到日 String dateTime = DateTime.now().toString("yyyy-MM-dd"); //5、拼接文件名 String realFileName = dateTime + uuidFileName ; //拼接dir根目录 String dirFileName = ossUploadConfig.getPrefix() + realFileName; //6、创建oss请求,传入三个参数 ossClient.putObject(ossUploadConfig.getBucketName(),dirFileName, inputStream); //7、拼接图片url路径,方便后续入库 url = "https://" + ossUploadConfig.getBucketName()+ "." + ossUploadConfig.getEndpoint() + "/" + dirFileName; }catch (Exception e){ e.printStackTrace(); }finally { //关闭client连接 ossClient.shutdown(); } return url; }
使用APIFOX测试一下
参数类型选择file就可以直接传输图片了
从返回结果可以看到上传成功了,返回了图片URL路径
去OSS里再看一下,图片名已经修改为:日期+UUID+originFileName,防止用户上传的图片相同,替换掉了原始图片