整合阿里云OSS,项目中有需要用到文件上传(如头像上传)等需求,则可以使用。
参考资料:https://juejin.cn/post/6984700528546545700?from=search-suggest#comment
创建 Bucket
如图设置,读写权限选择公共读
获取几个必需的参数
endpoint:地域节点,如
oss-cn-chengdu.aliyuncs.com
accessKeyId、accessKeySecret:在个人中心的AccessKey中获取
bucketName:创建的桶名称
dirPrefix:可以设置一个保存文件的文件目录前缀,比如项目名字
添加依赖
添加阿里云OSS的maven依赖
<!-- 阿里云 oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
修改 application.yml 文件添加参数
将必需的参数添加到配置文件中,方便获取
aliyun:
oss:
# oss对外服务的访问域名
endpoint: oss-cn-chengdu.aliyuncs.com
# 访问身份验证中用到用户标识
accessKeyId: LTAI5t*******
# 用户用于加密签名字符串和oss用来验证签名字符串的密钥
accessKeySecret: d6N7***********
# oss的存储空间
bucketName: miykah-project
# 上传文件大小(M)
maxSize: 5
# 上传文件夹路径前缀
dir:
prefix: ojsystem
创建配置类 AliyunOssClientConfig
创建一个配置类 AliyunOssClientConfig.java
,获取配置文件中的参数,并创建一个 OSSClient 的 bean 到容器中。
@Configuration
@ConfigurationProperties(prefix = "aliyun.oss")
@Data
public class AliyunOssClientConfig {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
@Bean
public OSSClient ossClient() {
return (OSSClient) new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
}
}
创建 Controller 和 Service
Controller
@RestController
@RequestMapping("/aliyunOss")
@Slf4j
public class OssController {
@Resource
private OssService ossService;
@PostMapping("/uploadImage")
public BaseResponse<String> uploadImage(@RequestParam("file") MultipartFile file) {
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
} catch (IOException e) {
log.error(e.getMessage());
}
String url = ossService.uploadImage(inputStream, file.getOriginalFilename());
return ResultUtils.success(url);
}
}
Service接口及实现类
public interface OssService {
String uploadImage(InputStream inputStream, String originalFilename);
}
@Service
public class OssServiceImpl implements OssService {
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.maxSize}")
private int maxSize;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
@Value("${aliyun.oss.dir.prefix}")
private String dirPrefix;
@Resource
private OSSClient ossClient;
@Override
public String uploadImage(InputStream inputStream, String originalFilename) {
String folder = DateUtil.today();
String fileName = UUID.randomUUID().toString();
String fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
// oss中的文件名:ojsystem/日期/文件.扩展名
String objectName = dirPrefix + "/" + folder + "/" + fileName + fileExtension;
// 创建上传文件的元信息,可以通过文件元信息设置HTTP header(设置了才能通过返回的链接直接访问)。
//如果不设置,直接访问url会自行下载图片,看各位自己选择
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType("image/jpg");
ossClient.putObject(bucketName, objectName, inputStream, objectMetadata);
String url = "http://" + bucketName + "." + endpoint + "/" + objectName;
return url;
}
}
测试接口
使用 Postman 进行测试,上传成功后,返回了 oss 中的 url
评论区