项目场景:
如果把图片视频等文件上传到自己的应用的Web服务器,在读取图片的时候会占用比较多的资源。影响应用服务器的性能。
所以我们一般使用OSS(Object Storage Service对象存储服务)存储图片或视频。
因为七牛云可以白嫖10G所以用七牛云
申请七牛云账号
想要使用七牛云服务首先得有一个七牛云账号,这个在七牛的官网上有详细的引导,傻瓜式操作,就不多说了。
创建完七牛云账号后,申请一个存储空间,这个也很简单,最好设置为公开的这样访问比较方便。
七牛云会给新用户分配临时域名,可以用30天,如果想使用自己的域名的话需要另外设置,我的域名是腾讯云买的这边简单讲下怎么搞,网上也有详细教程。
1.创建域名
在空间管理>域名管理中点击绑定域名。
在跳转的页面中加速域名一栏输入自己的域名,因为用作资源访问用最好设置二阶域名,比如res.xxx.com之类的。设置完了之后会要求验证域名所有权,按照七牛云的步骤来就好,记得在自己的域名提供商添加域名解析
res.xxx.com。
在域名设置好了之后,再次进入空间管理>域名管理,点绑定域名绑定自己的域名就可以了,之后在文件管理的外链域名中设置为自己的域名,就可以通过外链域名直接访问上传上去的资源了。(例如资源文件路径为test/test.jpg,访问http://res.xxx.com/test/test.jpg)
上传文件
上传文件也没有什么好说的直接复制七牛云的开发者文档复制粘贴就好,这里放上我的小demo。
@Service
@ConfigurationProperties("oss")
@Setter
public class FileServiceImpl implements FileService {
@Override
public BaseResult uploadImg(MultipartFile img, PreFilePathEnum preFilePathEnum) {
String filename = img.getOriginalFilename();
// 判断图片格式是否正确
if (!filename.endsWith(".jpg") && !filename.endsWith(".png")){
throw new BlogException(BlogErrorInfoEnum.FILE_UPLOAD_ERROR);
}
String endFileName = filename.substring(filename.lastIndexOf("."));
//默认不指定key的情况下,以文件内容的hash值作为文件名
InputStream inputStream = null;
try {
inputStream = img.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
String key = preFilePathEnum.getPath() + FileUtils.getMd5(inputStream) + endFileName;
String path = url + key;
// 判断文件是否存在,若存在则直接返回地址
if (FileUtils.ossFileExists(url + key)){
return BaseResult.success(path);
}
// 上传文件
ossUploadFile(img, key);
return BaseResult.success(path);
}
private String accessKey;
private String secretKey;
private String bucket;
private String url;
private void ossUploadFile(MultipartFile img, String key) {
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
// 加了缺少参数不知道为啥
// cfg.resumableUploadAPIVersion = Configuration.ResumableUploadAPIVersion.V2;// 指定分片上传版本
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
//...生成上传凭证,然后准备上传
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(img.getInputStream(), key, upToken, null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
throw new BlogException(BlogErrorInfoEnum.FILE_UPLOAD_ERROR);
} catch (IOException e) {
e.printStackTrace();
}
return;
}
}
其中比较关键的是
accessKey 可以在头像下面的密钥管理中获取
secretKey 可以在头像下面的密钥管理中获取
bucket 为你创建的储存空间名称
这里使用@ConfigurationProperties("oss")
注解在yml文件中配置后springboot会自动注入。
说在最后
安全申明:本人才疏学浅,若有任何谬误,欢迎指正