内容类型'multipart/form-data; boundary = ----...; charset = UTF-8'不受支持

sda*_*sdf 9 java rest spring spring-mvc spring-boot

我想将一个对象发送到控制器,该控制器有几个带文件的列表和几个带纯文本的字段.

public class ContributionNew<T extends MovieInfoDTO> {
    private List<T> elementsToAdd;
    private Map<Long, T> elementsToUpdate;
    private Set<Long> idsToDelete;
    private Set<String> sources;
    private String comment;
}

public class Photo extends MovieInfoDTO {
    private MultipartFile photo;
}

@PostMapping(value = "/{id}/contributions/photos")
@ResponseStatus(HttpStatus.CREATED)
public
ResponseEntity<Void> createPhotoContribution(
        @ApiParam(value = "The movie ID", required = true)
        @PathVariable("id") final Long id,
        @ApiParam(value = "The contribution", required = true)
        @RequestBody @Valid final ContributionNew<Photo> contribution
) {
Run Code Online (Sandbox Code Playgroud)

我正在使用邮递员发送数据.然而,他把我扔了

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarywY7ByvgonAjDoaCT;charset=UTF-8' not supported
Run Code Online (Sandbox Code Playgroud)

我应该为这个控制器设置Content-type,以便我可以发送一个包含纯文本字段和带文件列表的对象?

如果我在标题中设置标题

Content-type: multipart/form-data; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

它把我扔进了控制台

org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
Run Code Online (Sandbox Code Playgroud)

plu*_*lue 12

在postman中,你需要将body设置为raw类型,从下拉列表中你可以选择JSON,我有类似的问题,这解决了我的问题.在这里查看屏幕

  • 这如何允许上传文件? (8认同)

unc*_*nty 8

如前所述,dknight @RequestBody表示将JSON或XML数据与DTO bean映射一起使用。如果是MultipartFile,则不能使用JSON数据,因此不能使用@RequestBody。尝试使用@ModelAttribute批注。

工作样本:

@PostMapping("/promoters")
@Timed
public ResponseEntity<PromoterDTO> createPromoter(@ModelAttribute PromoterDTO promoterDTO) throws URISyntaxException { ... }
Run Code Online (Sandbox Code Playgroud)

使用PromoterDTO像这样:

    public class PromoterDTO implements Serializable {

        private Long id; 

        private String name;

        private String address;

        private MultipartFile logo;
    }
Run Code Online (Sandbox Code Playgroud)

  • 你设置了 getter 和 setter 了吗? (3认同)
  • 实现此操作后,我在对象中得到空值。所有字段均为空 (2认同)
  • 完全按照此操作说明 DTO 已正确填充,但变量“logo”仍然为“null”。有任何想法吗? (2认同)

sou*_*ARI 6

大家好,只需将 @RequestBody 更改为 @ModelAttribute

public ResponseEntity<DTO> exemple(@ModelAttribute Dto dto) throws TechnicalException
Run Code Online (Sandbox Code Playgroud)

快乐编码。


小智 5

而不是@RequestBody,使用@RequestParam

  • 您能更详细地解释一下这将如何解决OP的问题吗? (2认同)

小智 5

import org.springframework.web.bind.annotation.ModelAttribute;
Run Code Online (Sandbox Code Playgroud)

使用@ModelAttribute而不是@RequestBody. 这对我有用。