SpringMVC实现多文件上传到七牛云

前言

最近在做某个业务开发,需要实现图片批量上传到七牛云,并将资源url存到数据库。这一个看似简单的流程,在实际开发中确实最常用的。所以,稍微总结一下。

上传流程

整个流程很简单,前端指定好文件的name属性,调用后台接口,Java程序通过遍历文件数组,通过七牛提供的API进行文件流上传,最终将文件存储到七牛的url插入到数据库。咱们直接贴上核心代码即可。

 @AutoWird
 private IRemarkService remarkService;
 @RequestMapping(value = "/remarkUploadImg",headers ="content-type=multipart/form-data" ,method = RequestMethod.POST)
 
    public  CommonResultDTO uploadImg(@RequestParam("files") MultipartFile[]files,Long remarkId,HttpServletRequest  request){
        CommonResultDTO dto = CommonResultDTO.createSuccessDTO();
        Account account = SessionUtil.getCurrentAccount(request, accountService);
        if (account == null) {
            dto.setMessage("请先登录");
            dto.setCode("000003");
            return dto;
        }
        if (StringUtils.isEmpty(remarkId)){
            dto.setMessage("请传入备注ID");
            dto.setCode("000004");
            return dto;
        }
        List<String>imgUrls=new ArrayList<>();
        //获取文件流
        if (files.length>0&&files!=null){
            for (MultipartFile file:files){
                try {
                String imgUrl=imgUpload(file,remarkId);
                imgUrls.add(imgUrl);
                } catch (IOException e) {
                   logger.info("请上传有效的文件");
                }
            }
        }
        return CommonResultDTO.createSuccessDTO(imgUrls);
    }

 /**
     * 七牛图片上传
     * @param file
     * @return
     */
    private String imgUpload(MultipartFile file,Long remarkId) throws IOException {
        InputStream inputStream=file.getInputStream();
        String  token=qiniuUtil.generateUploadToken();
        String orgName= file.getOriginalFilename();
        String newName=orgName.substring(orgName.lastIndexOf("."));
        String uuid=UUID.randomUUID().toString().replace("-","");
        String key=uuid+newName;
        String relKey=qiniuUtil.uploadFile(inputStream,key,token);
        if (!StringUtil.isEmpty(relKey)){
          String imgUrl=QiniuUtil.baseUrl+relKey;
           Resimg resimg=new Resimg();
           resimg.setImgUrl(imgUrl);
           resimg.setRemarkId(remarkId);
           resimgService.addImg(resimg);
          return imgUrl;
        }
        return "";
    }

批量就是后端通过接收一个MultipartFile 数组文件,这里要注意参数名,方法类型以及headers指定contentType。这是controller层的实现,最终的上传重点在QiniuUtil 工具类中:

@Component
@Slf4j
public class QiniuUtil {

    public static final String UPLOAD_TOKEN ="qiniuToken";

    public static final Integer TOKEN_EXPIRE = 3400;

    public  static  final String AccessKey="yourAccessKey";
    public  static  final String SecretKey="yourSecretKey";
    private  static  final String bucket = "yourBucket";


    public   static  final  String baseUrl="https://example.com/";


    //生成上传Token
    public  String generateUploadToken(){
        Auth auth = Auth.create(AccessKey, SecretKey);
        String upToken = auth.uploadToken(bucket);
        return  upToken;
    }
    public String uploadFile(InputStream inputStream, String key, String upToken){
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.huadong());
        UploadManager uploadManager = new UploadManager(cfg);
        try {
            Response response = uploadManager.put(inputStream, key, upToken,null,null);
            //解析上传成功的结果
            DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
            log.info("上传图片成功,返回的key:{}",putRet.key);
            return  putRet.key;
        } catch (QiniuException ex) {
            Response r = ex.response;
           log.error(r.toString());
            try {
                log.info(r.bodyString());
            } catch (QiniuException ex2) {
            }
        }
        return "";
    }

}

测试

在这里插入图片描述
上传成功后,我们可以看到数据库表中插入了新的记录:
在这里插入图片描述

总结

文件上传在实际开发中比较常见,不过大体的代码思路都差不多,主要是要搞懂整个流程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值