新增时同时上传文件和传递参数

该代码示例展示了在SpringMVC中如何处理文件上传和JSON参数。@RequestParam用于接收非文件参数,而@RequestPart用于处理multipart/form-data类型的文件上传。Gson库被用来从JSON字符串转换为TaskIssues对象。如果文件不为空,它会被上传到服务器并关联到任务信息。
摘要由CSDN通过智能技术生成
  @PostMapping("insert")
    public R insert(@RequestParam(value = "paramJson") String paramJson, @RequestPart(value = "file",required = false) MultipartFile file){
        Gson gson = new Gson();
        TaskIssues taskIssues = gson.fromJson(paramJson, TaskIssues.class);
        /*将文件上传到服务器*/
        if (file != null  && file.getContentType()!=null ) {
            List<SysUploadFile> upload = sysUploadFileService.upload(file);
            for (SysUploadFile s : upload) {
                taskIssues.setAnnex(s.getUrl());
            }
        }
        taskIssues.setCreateBy(getUserId().toString());
        taskIssuesService.insert(taskIssues);
        return R.ok("新增成功");
    }

注意

@RequestParam接收对象,不能使用@RequestBody接收对象

不然会出现Content type 'multipart/form-data;boundary=--------------------------036764477110441760467042;charset=UTF-8' not supported的错误。

为什么不支持这种类型呢?

我们在上传文件时,spring框架会自动装配文件类型,使用@RequestBody接收对象,所对应的content-type :application/json。所以当使用@RequestBody和文件上传的时候,会报错。

@RequestPart

@RequestPart用于将multipart/form-data类型数据映射到控制器处理方法的参数中。除了@RequestPart注解外,@RequestParam同样可以用于此类操作。

 请求头中是否必须包含指定的值,默认值为true

    requiredtrue时,如果请求头中缺少指定的值,则会抛出异常。

    requiredfalse时,如果请求头中缺少指定的值,则会返回null

Gson是JSON解析器,与另一款优秀的JSON解析器FastJson相比Gson的优势是可以准确顺利的转换复杂Bean。如果需要,可以深入了解一下

//保存文件到指定位置 并返回文件的相关信息 
private List<SysUploadFile> upload(MultipartFile multipartFile) {

        final long FILE_MB_UNIT_SIZE = 1024;
        final long FILE_GB_UNIT_SIZE = 100*1024 * 1024;
        //用于存储返回数据
        List<SysUploadFile>  sysUploadFileList = Lists.newArrayList();
        SysUploadFile sysUploadFile = new SysUploadFile();
        //获取文件大小
        long fileSize = multipartFile.getSize();
        long kbSize = fileSize / FILE_MB_UNIT_SIZE; //kb
        long mSize = fileSize / FILE_GB_UNIT_SIZE;//MB
        if (mSize > 0){
            sysUploadFile.setSize(StringUtils.join(mSize, "M"));
        } else {
            sysUploadFile.setSize(StringUtils.join(kbSize, "kb"));
        }

            // 5. 上传文件 (文件字节, 文件扩展名, )
            // 5.1 获取文件扩展名
            String fileName = multipartFile.getOriginalFilename();
            String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);
            // 5.2 上传
              String fileDirPath = "D:/server/file"; // 存放位置
            File dirFile = new File(fileDirPath);
            // 判断文件目录是否存在
            if (!dirFile.exists()) {
                // 如果目录没有, 则应该新建目录
                dirFile.mkdir();
            }
            // 准备文件上传路径, 路径 + 文件名称
            String filePath= IdUtils.simpleUUID()+fileName;
            File realFile = new File(fileDirPath + "/" + filePath); // 保存磁盘路径 + 文件名拼接
            // 将字节信息输出到文件中
            try {
                multipartFile.transferTo(realFile); // 保存到指定的路径
            } catch (IOException e) {
                e.printStackTrace();

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

写完之后就可以测试了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值