前言
笔记参考
三更草堂
为什么?
因为如果把图片视频等文件上传到自己的应用的Web服务器,在读取图片的时候会占用比较多的资源。影响应用服务器的性能。
所以我们一般使用OSS(Object Storage Service对象存储服务)存储图片或视频。
快速开始
一、添加依赖
<dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>[7.7.0, 7.7.99]</version></dependency>
二、配置yml文件
qiniu-oss:# 密钥accessKey: q9xw_WzS18ZkZrpwmq16iILG0uZkqwdmlvq8omgasecretKey: c2Y8CI201-WGHaQ2ng2yhgVfV9O_QeZZdUsdSRl_# 空间名称bucket: frozenpenguin# 七牛云提供的测试域名testUrl: http://rbx06lhom./
三、编写代码
PathUtils
用于根据当前日期生成路径
public class PathUtils {public static String generateFilePath(String fileName){//根据日期生成路径 /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 -> .jpgString fileType = fileName.substring(index);return new StringBuilder().append(datePath).append(uuid).append(fileType).toString();}}
UploadController
@RestControllerpublic class UploadController {@Autowiredprivate UploadService uploadService;@PostMapping("/upload")public ResponseResult uploadImg(MultipartFile img){return uploadService.uploadImg(img);}}
UploadService
public interface UploadService {ResponseResult uploadImg(MultipartFile img);}
UploadServiceImpl
@Service@Data@ConfigurationProperties(prefix = "qiniu-oss")public class OssUploadService implements UploadService {@Overridepublic ResponseResult uploadImg(MultipartFile img) {//判断文件类型//获取原始文件名String originalFilename = img.getOriginalFilename();//对原始文件名进行判断(此处只允许png图片)if(!originalFilename.endsWith(".png")){//此处可以自定义抛出异常给前端//throw new SystemException(AppHttpCodeEnum.FILE_TYPE_ERROR);throw new RuntimeException("文件格式有误")}//如果判断通过上传文件到OSSString filePath = PathUtils.generateFilePath(originalFilename);String url = uploadOss(img,filePath);// 2099/2/3/wqeqeqe.pngreturn ResponseResult.okResult(url);}private String accessKey;private String secretKey;private String bucket;private String testUrl;private String uploadOss(MultipartFile imgFile, String filePath){//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.autoRegion());//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//默认不指定key的情况下,以文件内容的hash值作为文件名String key = filePath;try {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 testUrl+key;//返回文件的url} 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 "www";}
四、测试
这里使用ApiPost测试
请求路径:xxxx/upload
请求参数:img
请求类型:File
测试上传成功,在七牛云对应空间可以查看到相应的图片