【JAVA】前端multipart/form-data传文件及参数,后端拿值问题

1. 首先multipart/form-data(主要是上传文件),必须要使用post方式才可以请求到;

2. 并且所有的文件和参数在HttpServletRequest 中拿到 

文件接受代码:

public static Map<String, String> reciveImageAndParams(HttpServletRequest request, String imageType, String uuid)
            throws Exception {
        Map<String, String> uri = new HashMap<>();
        log.info("上传图片");
        DateFormat format = new SimpleDateFormat("yyyy-MM");
        String time = format.format(new Date());
        String tempPathDir = "";
        File tempPathDirFile = new File(tempPathDir);
        String realDir = "product/" + imageType + "/" + time + "/" + uuid;
        try {
            //文件上传的三部曲
            //创建工厂
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 设置缓冲区大小,这里是400kb
            factory.setSizeThreshold(4096 * 100);
            // 设置缓冲区目录
            factory.setRepository(tempPathDirFile);
            // Create a new file upload handler
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置上传文件的大小 12M
            upload.setSizeMax(4194304 * 3);
            //创建解析器 // 得到所有的文件
            List<FileItem> items = upload.parseRequest(request);
            Iterator<FileItem> i = items.iterator();
            while (i.hasNext()) {
                FileItem fi = i.next();
                // false表示文件 否则字段
                if (!fi.isFormField()) {
                    String fileName = fi.getName();
                    if (fileName != null) {
                        // 这里加一个限制,如果不是图片格式,则提示错误. (gif,jpg,jpeg,bmp,png)
                        String suffixName = FilenameUtils.getExtension(fileName);
                        if ("jpg".equalsIgnoreCase(suffixName) || "jpeg".equalsIgnoreCase(suffixName)
                                || "png".equalsIgnoreCase(suffixName)) {
                            // 文件名
                            DateFormat format2 = new SimpleDateFormat("yyyyMMddHHmmss");
                            String baseName = FilenameUtils.getBaseName(fileName);
                            String dirFileUri = realDir + "/" + baseName + format2.format(new Date()) + "." +
                                    suffixName;
                            QiNiuFileUp.byteUpoad(fi.get(), dirFileUri);
                            // baseName文件名字  dirFileUri上传的到七牛云的key
                            log.info("key:{}", fi.getFieldName());
                            uri.put(fi.getFieldName(), dirFileUri);
                        } else {
                            throw new ProcureException("文件格式不正确");
                        }
                    }
                } else {
                    fi.getString("UTF-8");
                    uri.put(new String(fi.getFieldName().getBytes("iso-8859-1"), "utf-8"),
                            new String(fi.getString().getBytes("iso-8859-1"), "utf-8"));
                }
            }
            return uri;

        } catch (ProcureException e) {
            log.error("上传图片失败", e, ImageUploadUtil.class);
            throw e;
        } catch (FileUploadException e) {
            throw new ProcureException("request文件接收失败");
        } catch (UnsupportedEncodingException e) {
            log.error("乱码解决失败");
            throw e;
        }
    }

2021年08月03日09:04:52更新:

在控制层直接使用MultipartFile类型接参即可。

1. 单独接(也可以使用@RequestParam):

 2. 封装到对象中:

 

因为前段传文件(文件流)只能form-data即form表单形式接参,不是Json形式,不可以加@RequestBody注解,@Validated是参数校验注解,可加可不加。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值