Ashurol 2022-07-25 12:54 采纳率: 50%
浏览 91

读取表单数据上传的多文件数据用了ServletFileUpload.parseRequest(request)返回的List<FileItem>的size=0

我是刚学习移动开发的,无奈也要写点后端数据作为前端开发学习的数据接口支持,我前端用模拟表单的模式实现了多文件上传,这个没问题了,但是后端问题比较大个,就是用java servlet开发接口出现读取表单数据上传的多文件数据用了ServletFileUpload.parseRequest(request)这个方法,返回的List的size=0,查了很多说因为spring已经有默认文件上传组件,使用ServletFileUpload时需要关闭spring boot的默认配置,解决方法:
在yml配置文件中添加
spring.servlet.multiparty.enabled=false;
现在问题是我找不到这个文件!
我用的是eclipse作为后端开发!而且spring不应该是需要配置才有的吗?我的项目啥也没有怎么也冲突了,有没有伙伴帮忙解答下!感恩!
下面是部分代码!

private String uploadParseRequest(HttpServletRequest httpServletRequest, ServletFileUpload servletFileUpload, String uploadPath)
            throws FileUploadException, IOException {
        String msg = "";

        // 解析前端请求,将每个表单项解析并封装成FileItem对象
//        List<FileItem> items = servletFileUpload.parseRequest(new ServletRequestContext(httpServletRequest));
        List<FileItem> fileItems = servletFileUpload.parseRequest(httpServletRequest);
        //这里获得的fileItems.size=0
        for (FileItem fileItem : fileItems) {
            // 判断表单项是否为上传文件
            if (fileItem.isFormField()) { // 普通文本
                String filedName = fileItem.getFieldName(); // 获取字段名:表单项name属性的值
                String value = fileItem.getString("UTF-8"); // FileItem对象中保存的数据流内容:即表单项为普通文本的输入值
                System.out.println(filedName + ":" + value);
            } else { // 上传文件
                // ------------------------1、处理文件------------------------


                String uploadFileName = fileItem.getName();// 上传文件名
                System.out.println("上传的文件名:" + uploadFileName);

                if (uploadFileName == null || uploadFileName.trim().equals("")) { // 文件名为空值或空
                    continue; // 进入下一轮循环,判断下一个FileItem对象
                }

                String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1); // 文件后缀名
                System.out.println("文件信息【文件名:" + uploadFileName + ",文件类型:" + fileExtName + "】");

                // 使用UUID保证文件名唯一
                String uuidPath = UUID.randomUUID().toString();

                // ------------------------2、处理路径------------------------

                // 存储路径:uploadPath
                String realPath = uploadPath + '/' + uuidPath; // 真实存在的路径
                // 给每个文件创建一个文件夹
                File realPathFile = new File(realPath);
                makeDirIfNotExist(realPathFile);

                // ------------------------3、文件传输------------------------

                // 获得输入流
                InputStream is = fileItem.getInputStream();
                // 获得输出流
                FileOutputStream fos = new FileOutputStream(realPathFile + "/" + uploadFileName);
                // 创建缓冲区
                byte[] buffer = new byte[1024];

                int len;
                while ((len = is.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }
                msg = "文件上传成功!";

                fileItem.delete(); // 上传成功,清除临时文件

                fos.close();
                is.close();
            }
        }

        return msg;
    }

  • 写回答

1条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2022-07-25 13:48
    关注

    你可以用这个来做MultipartFile 。

      @RequestMapping(value = "/xxx/importCsvFile", method = RequestMethod.POST)
        public String getImgPaths(@RequestParam(value = "uploadFile", required = false) MultipartFile[]  uploadFile) {
            String filePaths= "";
            for (MultipartFile file : uploadFile) {
                    String oldName = file.getOriginalFilename(); //文件名
                    String fileType = oldName.substring(oldName.lastIndexOf(".") + 1); //文件后缀
                    file.getInputStream();//获取文件流,然后自己处理保存
                    if (!list.contains(fileType)){
                        throw new BizException("201","图片格式只能为jpg或png");
                    }
                    String format = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
                    File directory=new File(url+format);
                    if (!directory.exists()){
                        directory.mkdirs();
                    }
                    //1、给上传的图片生成新的文件名
                    String  newName = UUID.randomUUID().toString().replaceAll("-","") + oldName.substring(oldName.lastIndexOf("."));
                    try {
                        file.transferTo(new File(directory,newName));
                    } catch (IOException e) {
                        e.printStackTrace();
                        logger.error("图片上传失败", e);
                    }
                        if (Objects.equals("",filePaths)){
                            filePaths= format+"/"+newName;
                        }else {
                            filePaths+=";"+format+"/"+newName;
                        }
            }
            return  filePaths;
        }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 7月25日
  • 创建了问题 7月25日

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题