大家平时在需要项目需要上传下载文件的时候都是怎么解决的呢,是把项目当文件服务器,还是说使用到了市面上的第三方存储服务呢?
今天我就一起来给大家介绍一下我的实现方案,我是使用的阿里的OSS对象存储服务,这个用起来还是很方便的,不错这个是收费的,但是是根据存储空间和流量计费的,相对来说还是比较不错的,最起码接入对象存储服务还是挺简单的。
接下来,我就使用SpringBoot的方法带大家接入OSS服务,在此之前,你需要在阿里云对象存储创建密钥,这个就不介绍的,挺简单的,不会的可以网上搜一下,非常简单,这里就不过多啰嗦了,直接进入正题。
1.引入阿里OSS依赖
<!-- oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
2.yml配置密钥
###############################################
######################oss######################
###############################################
aliyun:
oss:
file:
endpoint: oss-cn-hangzhou.aliyuncs.com
keyid: xxxxxx
keysecret: xxxxxx
bucketname: oss
3.创建一个OSS配置类
这个是为了映射配置文件中的参数的,当然不建这个类直接写在方法里也是可以的,这里仅供参考。
package cn.youhaveme.config;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class OssConfig implements InitializingBean {
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
/**
* 定义公开静态常量
*/
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
4.OSS Service
这里才是直接与OSS对象存储服务对接的一些东西,其实这么来说吧,有了官方的OSS开发包后,这一切都是那么的简单的,只需要调用就行了,也不用自己再去写什么其他东西了,直接使用就行了。
package cn.youhaveme.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.youhaveme.config.OssConfig;
import cn.youhaveme.service.OssService;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Slf4j
@Service("ossService")
public class OssServiceImpl implements OssService {
@Override
public String uploadImage(MultipartFile file) {
String endpoint = OssConfig.END_POINT;
String accessKeyId = OssConfig.ACCESS_KEY_ID;
String accessKeySecret = OssConfig.ACCESS_KEY_SECRET;
String bucketName = OssConfig.BUCKET_NAME;
try {
//创建oss实例
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
//获取上传文件的输入流
InputStream fileInputStream = file.getInputStream();
//获取原文件名
String filename = file.getOriginalFilename();
if (StrUtil.isBlank(filename)) {
return null;
}
String currentTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS"));
filename = currentTime + filename;
//上传到指定目录的指定文件
filename = "oss/upload/" + filename;
/*
* 调用OSS实现文件的上传
* 第一个参数:Bucket名称
* 第二个参数:上传到oss的指定路径和文件名称, oss/image/xx.png
* 第三个参数:上传文件输入流
*/
ossClient.putObject(bucketName, filename, fileInputStream);
//关闭OSSClient
ossClient.shutdown();
//返回上传到OSS的文件的URL,这里使用自定义域名,因此自己手动拼接路径
return "https://oss域名前缀/" + filename;
} catch (Exception e) {
log.error("文件上传失败", e);
return null;
}
}
}
5.Controller调用
这里前端直接通过文件流的方式调用,OSS服务经过处理返回前台一个oss地址,前台在把这个地址不管是渲染到页面还是存储啊都是非常方便的。
package cn.youhaveme.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.youhaveme.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/file")
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class OssController {
@Autowired
private OssService ossService;
@SaCheckLogin
@RequestMapping("/upload")
public String uploadImage(MultipartFile file) {
if (file == null) {
return "";
}
String uploadImage = ossService.uploadImage(file);
log.info("uploadImage:{}", uploadImage);
return uploadImage;
}
}
到这里,SpringBoot接入OSS就已经结尾了,别的不说,就单纯这个接入还是挺简单的,基本上毫无难度而言。