【问题标题】:Multipartfile in java dtojava dto中的多部分文件
【发布时间】:2020-06-26 02:06:57
【问题描述】:

我的要求是,我想获取 json 数据和文件。
用户可以上传文件并将他的数据发送为(例如姓名、电子邮件、图片);

我有一个简单的 DTO,看起来像这样(下)

public class SampleDTO {

    private String sample1;
    private MultipartFile file;

    public String getSample1() {
        return sample1;
    }
    public MultipartFile getFile() {
        return file;
    }
    public void setSample1(String sample1) {
        this.sample1 = sample1;
    }
    public void setFile(MultipartFile file) {
        this.file = file;
    }
}

我有一个如下所示的示例 API(如下)

@PostMapping("/sampleAPI")
public void sampleAPI(@RequestBody SampleDTO sampleDto) {
 log.info("sampleDto"+sampleDto);
 log.info("sampleDtoFile"+sampleDto.getFile());
 log.info("sampleDtoSample1"+sampleDto.getSample1());
}

如果我调用此 API,则不会打印任何日志,并且会收到此类错误 (Internal server error)。我在这里做错了什么?

我使用 Postman 的 formdata 作为正文,并在 javascript 中使用 new FormData() 作为 API 正文。

【问题讨论】:

  • 你试过用@ModelAttribute 代替@Requestbody 吗?
  • 或者你也可以尝试存储服务器的路径并从服务器@Vinay获取MultiPartFile
  • @MOnkey 是的!我试过@ModelAttribute 它基本上将每个DTO 键转换为@RequestParam。但是如果我在DTO 中有大约 25 个键怎么办,所以我的 API url 看起来像这样 sampleAPI?sample1=test+sample2..so on
  • @Vinay Johnwesly ,但你的请求是 POST 请求?
  • @MOnkey 是的,它是 POST 请求,但你建议使用 @ModelAttribute,所以我尝试了,结果是这样的(它将每个 DTO 键转换为参数)

标签: java spring-boot file file-upload


【解决方案1】:

将请求传递给 API 时,您不能在对象内发送多部分文件。尝试将所有参数作为 REQUEST PARAMETERS 分别作为请求的一部分传递。

此外,请不要忘记对您的 API 进行相应的更改,如上所述。

使用 Postman 时,请确保在正文中您处于表单数据下,并传递了键和值。还用适当的类型(文本/文件)标记键。截图如下

【讨论】:

    【解决方案2】:

    不要使用@Requestbody使用@RequestParam来获取您的MultiPart Mix formDate。

    @PostMapping("/sampleAPI")
    public String upload(@RequestParam("file") MultipartFile file, 
                           @RequestParam("sample1") String sample1 ) {
        SampleDTO sampleDto = new SampleDTO ();
        sampleDto.setSample1(sample1);
        sampleDto.setFile(file);
        return sample1 + "\n" + file.getOriginalFilename() + "\n" + file.getSize();
    }
    

    对于多个键,请尝试使用 @RequestParamConverter,类似这样。

    @Component
    public class StringToSampleDTOConverter implements Converter<String, SampleDTO> {
    
        @Autowired
        private ObjectMapper objectMapper;
    
        @Override
        @SneakyThrows
        public SampleDTO convert(String source) {
          return objectMapper.readValue(source, SampleDTO.class);
        }
    }
    
    @PostMapping("/sampleAPI")
    public String upload(@RequestParam("file") MultipartFile file, 
                       @RequestParam("sampleDto") SampleDTO sampleDto ) {
        sampleDto.setFile(file);
        return sampleDto + "\n" + file.getOriginalFilename() + "\n" + file.getSize();
    }
    

    【讨论】:

    • 出于演示目的,我只向 DTO 添加了 1 个密钥,但实际上我有大约 25 个密钥。对 25 个键使用请求参数不是一个好主意。有没有其他选择?
    • 我猜你需要将 @RequestParam 和 Converter(docs.spring.io/spring-framework/docs/current/javadoc-api/org/…) 一起用于 JSON 对象。
    • @Vinay Johnwesly,您尝试过我编辑的解决方案吗?
    猜你喜欢
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多