解决海量数据存储与弹性扩容以及高并发的问题,项目中我们采用云存储的解决方案-阿里云OSS
一、对象存储OSS
1、开通“对象存储OSS”服务
- 申请阿里云账号
- 实名认证
- 开通“对象存储0SS”服务
- 进入管理控制台
2、创建 Bucket
Bucket名称:自己取
地域:华北2(北京)
存储类型:标准存储
同城冗余存储:关闭
版本控制:不开通
读写权限:公共读
服务器加密方式:无
实时日志查询:不开通
定时备份:不开通
点击创建 bucket
3、上传文件
4、创建RAM子用户
记住自己的 AccessKey ID 和 AccessKey Secret
二、使用SDK
1、点击学习路径进入
2、找到java开发参考
3、创建一个maven项目
此处省略。。。。
4、太耐 pom 依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
5、修改 application.yml 文件
aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com
keyId: 自己的 AccessKey ID
keySecret: 自己的 AccessKey Secret
bucketName: 创建 bucket 的名字
6、创建实体类:
package com.entity;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 丛配置文件读取变量
*/
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {
private String endpoint;
private String keyId;
private String keySecret;
private String bucketName;
}
7、创建 service 接口和实现类
package com.service;
import java.io.InputStream;
/**
* @Author cb
* @createTime
* @Version
* @注释:文件上传服务接口
*/
public interface FileService {
String upload(InputStream inputStream, String module, String originalFileName);
}
请参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流
package com.service.impl;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import com.service.FileService;
import com.entity.OssProperties;
import jakarta.annotation.Resource;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.UUID;
/**
* @Author cb
* @createTime
* @Version
* @注释:文件上传服务实现类
*/
@Service
public class FileServiceImpl implements FileService {
@Resource
private OssProperties ossProperties;
/**
* 阿里云Oss文件上传
*
* @param inputStream 上传文件的输入流
* @param module 上传到oss的文件目录
* @param originalFileName 原始文件名
* @return 返回上传上去之后的url地址
*/
@Override
public String upload(InputStream inputStream, String module, String originalFileName) {
String endpoint = ossProperties.getEndpoint();
String accessKeyId = ossProperties.getKeyId();
String accessKeySecret = ossProperties.getKeySecret();
String bucketName = ossProperties.getBucketName();
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
String folder = new DateTime().toString("yyyy/MM/dd");
// 文件名
String fileName = UUID.randomUUID().toString();
//文件扩展名
String fileExtention = originalFileName.substring(originalFileName.lastIndexOf("."));
String objectName = module+"/"+folder+"/"+fileName+fileExtention;
ossClient.putObject(bucketName, objectName, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
return "https://"+bucketName+"."+endpoint+"/"+objectName;
}
}
8、创建Controller类实现API接口
package com.controller;
import com.result.R;
import com.result.ResultCodeEnum;
import com.utils.ExceptionUtils;
import com.service.FileService;
import com.exception.JavaclimbException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
/**
* @Author
* @createTime
* @Version
* @注释:阿里云文件管理控制类
*/
@Tag(name = "阿里云文件管理",description = "阿里云文件管理")
@RestController
@RequestMapping("/admin/oss/file")
@Slf4j
@CrossOrigin
public class FileController {
@Resource
private FileService fileService;
@Operation(description = "阿里云文件上传")
@PostMapping(value = "/upload")
public R upload(@Parameter(description = "文件",required = true)@RequestParam("file") MultipartFile file,
@Parameter(description = "模块",required = true)@RequestParam("module") String module){
try {
InputStream inputStream = file.getInputStream();
String orginalFileName = file.getOriginalFilename();
String url = fileService.upload(inputStream,module,orginalFileName);
return R.ok().message("文件上传成功").data("url",url);
} catch (IOException e) {
log.error(ExceptionUtils.getMessage(e));
throw new JavaclimbException(ResultCodeEnum.FILE_UPLOAD_ERROR);
}
}
}
三、测试
上传成功;如有问题指导联系我改正,谢谢;