SpringBoot上传头像之七牛云oss
UploadController
@RestController
public class UploadController {
@Autowired
private UploadService uploadService;
//头像上传接口
@PostMapping("/upload")
public ResponseResult uploadImg(MultipartFile img){
return uploadService.uploadImg(img);
}
}
UploadServiceImpl
package com.mrs.service.impl;
import com.google.gson.Gson;
import com.mrs.common.ResponseResult;
import com.mrs.common.enums.AppHttpCodeEnum;
import com.mrs.exception.SystemException;
import com.mrs.service.UploadService;
import com.mrs.utils.PathUtils;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
/**
* description: UploadServiceImpl
* date: 2022/8/10 22:15
* author: MR.孙
*/
@Service
@Data
@ConfigurationProperties(prefix = "oss")
public class UploadServiceImpl implements UploadService {
/**
* @description: 头像上传
* @param img
* @return: com.mrs.common.ResponseResult
* @author: MR.孙
* @date: 2022/8/10 22:16
*/
@Override
public ResponseResult uploadImg(MultipartFile img) {
//判断文件类型
//获取原始文件名
String originalFilename = img.getOriginalFilename();
//对原始文件名进行判断
if(!originalFilename.endsWith(".png")){
throw new SystemException(AppHttpCodeEnum.FILE_TYPE_ERROR);
}
//如果判断通过上传文件到OSS
String filePath = PathUtils.generateFilePath(originalFilename);
String url = uploadOss(img,filePath);
return ResponseResult.okResult(url);
}
private String accessKey;
private String secretKey;
private String bucket;
private String urlPrefix;
private String uploadOss(MultipartFile imgFile, String filePath) {
//构造一个带指定 Region 对象的配置类
Configuration cfg = new Configuration(Region.autoRegion());
//...其他参数参考类注释
UploadManager uploadManager = new UploadManager(cfg);
String key = filePath;// 2022/8/11/filename.png
try {
// byte[] uploadBytes = "hello qiniu cloud".getBytes("utf-8");
// ByteArrayInputStream byteInputStream = new ByteArrayInputStream(uploadBytes);
InputStream inputStream = imgFile.getInputStream();
Auth auth = Auth.create(accessKey, secretKey);
String upToken = auth.uploadToken(bucket);
try {
Response response = uploadManager.put(inputStream, key, upToken, null, null);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);
System.out.println(putRet.hash);
return urlPrefix+key;
} catch (QiniuException ex) {
Response r = ex.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
} catch (Exception ex) {
//ignore
}
return "文件上传七牛云oss失败,请重新尝试";
}
}
PathUtils
用于生成上传到七牛云的目录+文件名的形式:2022/8/11/filename.png
public class PathUtils {
public static String generateFilePath(String fileName){
//根据日期生成路径 2022/1/15/
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");
String datePath = sdf.format(new Date());
//uuid作为文件名
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
//后缀和文件后缀一致
int index = fileName.lastIndexOf(".");
// test.jpg -> .jpg
String fileType = fileName.substring(index);
return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();
}
}
//默认不指定key的情况下,以文件内容的hash值作为文件名
//key,不仅可以指定文件名,还可以指定目录+文件名的形式 2022是一个目录是根据 / 区分的
filePath就是PathUtils生成的七牛云文件路径
urlPrefix就是就是文件外链的临时域名,最后的文件外链就是由临时域名+文件名
yml
oss:
accessKey: zhbshfaolSddWY-rNts8x293U_Zu5t0G47BaNs-V
secretKey: KOjhpebuEDqQPZb-ijA96I0WTvlhwWlfq-As6VrD
bucket: slzgg666
urlPrefix: http://rgeeq1n4k.hn-bkt.clouddn.com/
测试