阿里云OSS使用
1. 前言
起初使用本地存储的形式进行文件上传,本地存储有几项缺点:无法直接访问,磁盘空间限制,受磁盘状态影响(如磁盘损坏)。
采用云存储OSS:
OSS会为每一个文件分配一个访问路径,可直接访问文件;在云服务中存储,不存在磁盘空间有限、磁盘损坏等问题的出现。
现使用阿里云OSS存储文件。
2. 阿里云OSS基本配置
2.1 在pom文件中引入依赖
<!--阿里云OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
2.2 在配置文件中添加阿里云OSS的配置
#阿里云OSS的配置
aliyun:
oss:
endpoint: https://oss-cn-beijing.aliyuncs.com
accessKeyId: ******** #在阿里云OSS获得
accessKeySecret: ******** #在阿里云OSS获得
bucketName: ********
2.3 创建一个对象,存储阿里云配置,方便后续变动时代码的书写
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss") //指定配置位置
public class aliyunOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
2.4 阿里云OSS工具类的书写
@Component
public class AliOSSUtils {
@Autowired
private aliyunOSSProperties aliyunOSSProperties;
//实现上传图片到OSS
public String upload(MultipartFile file) throws IOException {
//获取参数
String endpoint = aliyunOSSProperties.getEndpoint();
String accessKeyId = aliyunOSSProperties.getAccessKeyId();
String accessKeySecret = aliyunOSSProperties.getAccessKeySecret();
String bucketName = aliyunOSSProperties.getBucketName();
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖(使用UUID设置文件名)
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件访问路径
String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
return url;// 把上传到oss的路径返回
}
}
3. 阿里云OSS工具类使用实现
//在Controller层中
@Slf4j
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils; //注入阿里云工具类对象
//通过阿里云上传文件
@PostMapping("/upload")
public Result upload(MultipartFile image) throws IOException {
log.info("文件上传,文件名:", image);
//调用阿里云OSS工具类进行文件上传
String url = aliOSSUtils.upload(image);
log.info("文件上传完成,文件访问的url:", url);
return Result.success(url);
}
}
4. 补充
在不使用阿里云存储时,文件上传后自动删除或存储在本地,Controller层代码如下:
@PostMapping("/upload") public Result upload(MultipartFile image) throws IOException { log.info("文件上传,文件名:", image); //获取原始文件名 String originalFilename = image.getOriginalFilename(); //构造唯一的文件名(文件名不能够重复) int index = originalFilename.lastIndexOf("."); String exname = originalFilename.substring(index); String newFileName = UUID.randomUUID().toString() + exname; log.info("新的文件名:{}", newFileName); //将文件存储在服务器的磁盘目录中 D:\图集\案例 image.transferTo(new File("D:\\图集\\案例\\"+newFileName)); return Result.success(); }
可以与阿里云OSS的使用做一下对比,使用云服务减少了受外界环境影响的概率,并且使用更为方便专业。