当前位置: 首页 > article >正文

【Java项目】SpringBoot实现一个请求同时上传多个文件和类并附上代码实例

文章目录

  • 前言
  • 文件多线程兼多文件上传
  • @RequestParam和@RequestPart的区别

前言

项目在做二手市场,然后商品的提交我们希望对商品的描述和商品的照片能一起传递到同一个接口来统一处理,而不是分发到两个接口中去处理,因为如果分到两个接口那么会特别麻烦。

文件多线程兼多文件上传

SpringBoot多线程兼多文件同时上传

@RequestParam和@RequestPart的区别

区别可以看这篇文章

在这里插入图片描述
可以先看上面这张图片展示出来的接口,我是用的是form-data表单提交,并且我并没有设定secHandGoods这个字段为application/json提交,那么默认他就是以字符串提交过去的,也就是说这里Java代码我只能使用@RequestParam的方式,如下
在这里插入图片描述
然后使用JSON.parseObject来完成对象类型的转换。
而如果我是用的是Postman进行请求提交,那么由于postman可以设定form-data提交的时候的content-type,那么我就可以使用@RequestPart来完成提交,如下
在这里插入图片描述
而postman这边设定secHandGoods这个参数为application/json即可
在这里插入图片描述
具体的需求对接其实是要看前端的,我们更倾向与使用第二种,因为如果使用JSON.parseObject,他的性能损耗还是有的。
大概的代码如下:
代码还没有优化,都是随便写写的,能大概跑完就行哈哈哈哈

/**
     * 用户更新自己的闲置商品
     *
     * @param sechandGoods
     * @return
     */
    @PutMapping("/updateGoods")
    public BaseResponse updateGoods(
            @RequestPart("files") MultipartFile[] files,
            //@RequestParam("secHandGoods") String jsonStr,
            @RequestPart("secHandGoods") SechandGoods sechandGoods,
            HttpServletRequest request) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        //SechandGoods sechandGoods = JSON.parseObject(jsonStr, SechandGoods.class);
        WXSessionModel user = (WXSessionModel) request.getSession().getAttribute("user");
        sechandGoods.setUserId(Long.valueOf(user.getUserId()));
        minioSysFileService.deleteFiles(sechandGoods.getGoodsPhotos());
        //MultipartFile[] files = sechandGoods.getFiles();
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        CountDownLatch countDownLatch = new CountDownLatch(files.length);
        for (int i = 0; i < files.length; i++) {
            try {
                MultipartFile file = files[i];
                //TODO 使用CountDownLaunch或者ComplatableFuture或者Semaphore
                //来完成多线程的文件上传
                fileThreadPool.submit(() -> {
                    try {
                        String url = minioSysFileService.uploadFile(file);
                        list.add(url);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    } finally {
                        //表示一个文件已经被完成
                        countDownLatch.countDown();
                    }
                });
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        try {
            //阻塞直到所有的文件完成复制
            countDownLatch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //统计每个文件的url
        String photoUrls = String.join(",", list);
        sechandGoods.setGoodsPhotos(photoUrls);
        int isUpdate = sechandGoodsService.updateSechandGoods(sechandGoods);
        //if (isUpdate == 0) {
        //    return ResponseData.error(CodeEnum.BODY_NOT_MATCH);
        //}
        return ResponseData.success(sechandGoods);
    }

    @Autowired
    private MinioSysFileServiceImpl minioSysFileService;
    @Autowired
    @Qualifier("fileThreadPool")
    private ThreadPoolExecutor fileThreadPool;

    /**
     * 用户上传商品
     *
     * @param sechandGoods
     * @param request
     * @return
     */
    @PostMapping("/saveGoods")
    public BaseResponse saveGoodByUserId(
            @RequestPart("files") MultipartFile[] files,
            //@RequestParam("secHandGoods") String jsonStr,
            @RequestPart("secHandGoods") SechandGoods sechandGoods,
            HttpServletRequest request) {
        WXSessionModel user = (WXSessionModel) request.getSession().getAttribute("user");
        //SechandGoods sechandGoods = JSON.parseObject(jsonStr, SechandGoods.class);
        sechandGoods.setUserId(Long.valueOf(user.getUserId()));
        //MultipartFile[] files = sechandGoods.getFiles();
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        CountDownLatch countDownLatch = new CountDownLatch(files.length);
        for (int i = 0; i < files.length; i++) {
            try {
                MultipartFile file = files[i];
                //TODO 使用CountDownLaunch或者ComplatableFuture或者Semaphore
                //来完成多线程的文件上传
                fileThreadPool.submit(() -> {
                    try {
                        String url = minioSysFileService.uploadFile(file);
                        list.add(url);
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    } finally {
                        //表示一个文件已经被完成
                        countDownLatch.countDown();
                    }
                });
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        try {
            //阻塞直到所有的文件完成复制
            countDownLatch.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        //统计每个文件的url
        String photoUrls = String.join(",", list);
        sechandGoods.setGoodsPhotos(photoUrls);
        sechandGoodsService.insertSechandGoods(sechandGoods);
        return ResponseData.success(sechandGoods);
    }

http://www.kler.cn/a/6275.html

相关文章:

  • Java 深拷贝全面解析
  • uniapp使用live-pusher实现模拟人脸识别效果
  • LaTeX 是一种基于标记的排版系统,广泛用于创建高质量的文档,特别是在需要复杂数学公式、表格、文献引用等的场景中
  • Vue(四)
  • 【漏洞复现】灵当CRM datapdf.php 任意文件读取漏洞
  • PyQt实战——随机涂格子的特色进度条(十一)
  • SIP终端常见的功能及协议支持
  • RocketMQ通信协议
  • IDEA在console中编写sql语句报红
  • 操作系统作业1
  • MongoDB - 索引知识
  • 众人围剿,GPT-5招惹了谁
  • 深入学习Redis:持久化
  • 决策树鸢尾花算法讲解
  • 蓝桥杯倒计时 | 倒计时10天
  • 3.30--Redis之常用数据结构--listpack(总结篇)------加油呀
  • 第十四届蓝桥杯大赛——真题训练第10天
  • STM32实验:串口接受和发送消息
  • MongoDB - 数据模型的设计模式
  • DDoS攻击原理,DDoS攻击怎么防护?
  • Nginx解决跨域问题(前端服务器,接口服务器)记录
  • Python 自动化指南(繁琐工作自动化)第二版:一、PYTHON 基础知识
  • 【群晖Drive私有云】利用cpolar内网穿透实现公网远程群晖Drive
  • for循环内线程池并发执行任务,等到子线程全部处理完任务,主线程在执行java的实现方式
  • c# 第一次作业
  • IU5706E低静态电流,同步升压直流-直流控制器