【背景】
存储系统中的图片、音频、视频,且视频的体积较大,可达2GB.
【比较】
之前存储系统用的是FastDFS,主要是存储一些word文档、图片等小文件;现在用的是阿里云的OSS(OSS的官方文档)。
【简介】
FastDFS:
FastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载), 适用于海量小文件(建议范围:4KB < file_size <500MB)、使用相对简单、小文件存储网上大多推荐使用FastDFS
OSS:
阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。它是一个分布式的对象存储服务,提供的是一个Key-Value对形式的对象存储服务。用户可以根据Object的名称(Key)唯一的获取该Object的内容。它具有与平台无关的RESTful API接口,能够提供99.99999999%的服务持久性。可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。OSS适合各种网站、开发企业及开发者使用。
【项目代码】
OssController
public class OssController {
@Autowired
private OssServiceImpl ossService;
/**
* 上传文件
*
* @param file
* @param paramStr
* @return
*/
@RequestMapping("/uploadFile")
public GenericResponse uploadFile(MultipartFile file, @RequestParam(value = "paramStr") String paramStr) {
GenericResponse genericResponse = null;
OssRequestVo ossRequestVo = new Gson().fromJson(paramStr, OssRequestVo.class);
try {
ossRequestVo.setInputStream(file.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
if (ossRequestVo.getInputStream() == null) {
genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件流不能为空");
} else if (StringUtils.isEmpty(ossRequestVo.getKey())) {
genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件Key不能为空");
} else if (StringUtils.isEmpty(ossRequestVo.getBucketName())) {
genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件bucket不能为空");
} else if (ossRequestVo.getStandard() == null) {
genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件Standard不能为空");
} else {
String url = ossService.uploadFile(ossRequestVo.getBucketName(), ossRequestVo.getInputStream(), ossRequestVo.getKey(), ossRequestVo.getStandard());
if (StringUtils.isNotEmpty(url)) {
OssResponseVo ossResponseVo = new OssResponseVo();
ossResponseVo.setUrl(url);
genericResponse = new GenericResponse(CommonEnum.ResponseCode.Success.getCode(), "上传成功", ossResponseVo);
} else {
genericResponse = new GenericResponse(CommonEnum.ResponseCode.Fail.getCode(), "上传失败");
}
}
return genericResponse;
}
}
OssServiceImpl
@Service
public class OssServiceImpl implements OssService {
@Autowired
private OSSClient ossClient;
/**
* 上传文件
*
* @param bucketName
* @param inputStream
* @param key 文件名称
* @return
*/
@Override
public String uploadFile(String bucketName, InputStream inputStream, String key, Integer type) {
//key文件名称
ossClient.putObject(bucketName, key, inputStream);
//生成url
return generatePresignedUrl(bucketName, key, type);
}
/**
* 生成文件访问地址
*
* @param key 文件名称
* @param type 1:标准;2:缩放图;3:icon;4:轮播
* @return
*/
public String generatePresignedUrl(String bucketName, String key, Integer type) {
if (StringUtils.isEmpty(key) || StringUtils.isEmpty(bucketName)) return "";
Date expiration = DateUtil.getInstance().addYearByN(new Date(), 20);
// 生成URL
if (type == null || type <= 0) {
// 生成URL
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
return url.toString();
} else {
//生成制定尺寸的地址
String style = "style/";
if (type == 1) {
style += CommonEnum.OssFileStandardEnum.STANDARD.getDesc();
} else if (type == 2) {
style += CommonEnum.OssFileStandardEnum.THUMBNAIL.getDesc();
} else if (type == 3) {
style += CommonEnum.OssFileStandardEnum.ICON.getDesc();
} else if (type == 4) {
style += CommonEnum.OssFileStandardEnum.BANNER.getDesc();
}
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
req.setExpiration(expiration);
req.setProcess(style);
URL url = ossClient.generatePresignedUrl(req);
return url.toString();
}
}
}
用到的枚举
public enum FileType {
图片(1, "img_"),
视频(2, "vedio_"),
文件(3, "file_"),
音频(4, "audio_"),;
private int code;
private String prefix;
FileType(int code, String prefix) {
this.code = code;
this.prefix = prefix;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
}
/**
* 文件存储分类
*/
public enum BucketName {
音视频(0, "pgy-vedio"),
图片(1, "pgy-images");
private Integer code;
private String desc;
BucketName(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
/**
* 文件标准
*/
public enum OssFileStandardEnum {
vedio (0, "vedio"),
STANDARD(1, "standard"),
THUMBNAIL(2, "thumbnail"),
ICON(3, "icon"),
BANNER(4, "banner");
private Integer code;
private String desc;
OssFileStandardEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}