一篇看懂OSS图片视频上传
简介
图片视频上传存储的方式有很多种,比如存在项目中、存在本地、存在服务器、放入第三方例如gitee、oss等,但在公司一般的业务中不会已前三者的方式存储。
问题:
- 存在项目中会很臃肿(文件大小不用说,上传服务器都懂);
- 存在本地,如果上传到服务器上也就获取不到视频图片了;
- 直接存在服务器中也是可以的,但是没试过
因为自己需求做朋友圈的动态发布,所以用整合OSS存储图片和视频充当笔记(OSS是收费的,有兴趣老表可以把图片存到gitee也可以,因为gitee是免费,可以用HttpClient读写)
gitee API : https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoStargazers?ex=no
SpringBoot整合OSS
pom.xml
<!-- oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
application.yml
#swagger
lanys:
swagger:
title: 牟某公司
description: 牟某公司
termsOfServiceUrl: https://eurasia.plus/swagger-ui.html
ContactName: xxx
ContactUrl: https://eurasia.plus/swagger-ui.html
ContactEmail: 1090613735@qq.com
version: 1.0
aliyun:
access_key_id: 拿自己OSS对应的数据
access_key_secret: 拿自己OSS对应的数据
bucket: 拿自己OSS对应的数据
endpoint: 拿自己OSS对应的数据
AliyunConfig
/**
* @author lanys
* @Description:
* @date 2/7/2021 下午3:12
*/
@Configuration
@ConfigurationProperties(prefix = "lanys.aliyun")
@Data
public class AliyunConfig {
private String access_key_id;
private String access_key_secret;
private String endpoint;
private String bucket;
@Bean
public OSS oSSClient() {
return new OSSClient(endpoint, access_key_id, access_key_secret);
}
}
Controller
@Autowired
private UpLoadFileUtil upLoadFileUtil;
@ApiOperation(value = "上传图片视频")
@PostMapping("/upload")
@ResponseBody
public List<OSSObjectSummary> create(MultipartFile[] upload) throws Exception {
upLoadFileUtil.upLoadVideos(upload);
return Result.success();
}
UpLoadFileUtil(工具)
/**
* @author lanys
* @Description:
* @date 2/7/2021 上午10:36
*/
@Component
@Slf4j
public class UpLoadFileUtil {
/**
* 图片格式
*/
private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
".jpeg", ".gif", ".png"};
private static final String[] VIDEOS = new String[]{".mp4"};
@Autowired
private OSS ossClient;
@Autowired
private AliyunConfig aliyunConfig;
/**
* 图像上传
* @param uploadFile 图像流处理
* @return
* @throws IOException
*/
public Boolean UpLoadImage(MultipartFile[] uploadFile) throws IOException {
// 校验图片格式
boolean isLegal = false;
log.info("----校验图片格式---");
for (MultipartFile multipartFile : uploadFile) {
// 校验图片格式
for (String type : IMAGE_TYPE) {
if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
isLegal = true;
break;
}
}
}
if (!isLegal){
log.info("----图片格式有误---");
return false;
}
for (MultipartFile multipartFile: uploadFile) {
//获取图片名称
String originalFilename = multipartFile.getOriginalFilename();
String filePath = getFilePath(originalFilename);
System.out.println(filePath);
try {
ossClient.putObject(aliyunConfig.getBucket(), filePath, new
ByteArrayInputStream(multipartFile.getBytes()));
log.info("--------图片上传成功--------");
} catch (Exception e) {
e.printStackTrace();
log.info("上传失败");
return false;
}
}
return true;
}
/**
* 视频上传
* @param uploadFile 视频流处理
* @return
* @throws IOException
*/
public Boolean upLoadVideos(MultipartFile[] uploadFile) throws IOException {
// 校验图片格式
boolean isLegal = false;
log.info("----校验图片格式---");
for (MultipartFile multipartFile : uploadFile) {
// 校验图片格式
for (String type : VIDEOS) {
if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
isLegal = true;
break;
}
}
}
if (!isLegal){
log.info("----视频格式有误---");
return false;
}
for (MultipartFile multipartFile: uploadFile) {
//获取图片名称
String originalFilename = multipartFile.getOriginalFilename();
String filePath = getFilePath(originalFilename);
System.out.println(filePath);
try {
ossClient.putObject(aliyunConfig.getBucket(), filePath, new
ByteArrayInputStream(multipartFile.getBytes()));
log.info("--------视频上传成功--------");
} catch (Exception e) {
e.printStackTrace();
log.info("上传失败");
return false;
}
}
return true;
}
/**
* 生成路径以及文件名
* @param sourceFileName
* @return
*/
private String getFilePath(String sourceFileName) {
DateTime dateTime = new DateTime();
return "uploads/dynamic/pictures/" + dateTime.toString("yyyy") + dateTime.toString("MM") + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
RandomUtils.nextInt(100, 9999) + "." +
StringUtils.substringAfterLast(sourceFileName, ".");
}
}
留了个坑,虽然图片和视频已经上传OSS中,但是做视频截取图片javacv及没有拼接路径,然后存储到数据库中,有兴趣可以自己动手。
OSS拼接的格式:
aliyun:
access_key_id: LTAI5tR3MemYvQMWpyy2spT2
access_key_secret: W0WfKE8WD3LZ8mQ2x5PMTZp820AFZ1
##桶
bucket: id2
endpoint: id3
/**
* 生成路径以及文件名
* @param sourceFileName
* @return
*/
private String getFilePath(String sourceFileName) {
DateTime dateTime = new DateTime();
return "uploads/dynamic/pictures/" + dateTime.toString("yyyy") + dateTime.toString("MM") + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
RandomUtils.nextInt(100, 9999) + "." +
StringUtils.substringAfterLast(sourceFileName, ".");
}
对照配置文件,格式就是:
https://id2.id3/生成路径以及文件名
例子:
http://resource.develop.hulimedib.com/uploads/dynamic/pictures/20200922/c5cfe146b656a9aa242993ea335de60d.PNG
总结:
整合的整个过程很简单,依赖+配置文件id,key等,配置bean带入id+key等就可以操作OSS中的文件读取。