繁体   English   中英

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

[英]Content type 'multipart/form-data;boundary=----...;charset=UTF-8' not supported

我想将 object 发送到 controller ,其中包含多个文件列表和多个纯文本字段。

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
) {

我正在使用postman发送数据。 然而,他把我扔了

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'multipart/form-data;boundary=----WebKitFormBoundarywY7ByvgonAjDoaCT;charset=UTF-8' not supported

我应该为这个 controller 设置什么内容类型,以便我可以发送一个包含纯文本字段和文件列表的 object?

如果我在 header 中设置 header

Content-type: multipart/form-data; charset=utf-8

它把我扔进控制台

org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found

正如 dknight @RequestBody 所说的,使用 JSON 或 XML 数据映射您的 DTO bean。 在 MultipartFile 的情况下,您不能使用 JSON 数据,因此您不能使用 @RequestBody。 尝试使用 @ModelAttribute 注释。

工作样本:

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

像这样的推广者DTO:

    public class PromoterDTO implements Serializable {

        private Long id; 

        private String name;

        private String address;

        private MultipartFile logo;
    }

在 Postman 中,您需要将正文设置为原始类型,然后从下拉列表中您可以选择 JSON,我遇到了类似的问题,这解决了我的问题。

在此处查看屏幕

而不是@RequestBody ,使用@RequestParam

而不是@RequestBody,使用@ModelAttribute 之类的,

@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)
        @ModelAttribute @Valid final ContributionNew<Photo> contribution
) {

使用 @ModelAttribute 而不是 @ResponseBody,因为它以键值对的形式占用数据,而后者用于像 json 这样的对象。 在点击 api 时,只需传递对象的多部分类型和 json 键值对。 它工作正常!

关于这个的堆栈溢出问题

import org.springframework.web.bind.annotation.ModelAttribute;

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

生产 = { "application/json" } 必须写在控制器中而不是消费 = { "application/json" }

这是使用 Spring Boot 2.1.7 在 Kotlin 中编写的完整代码示例

Example 使用一个ProfileRepository ,你当然可以实现它。

Kotlin 很好,因为data class已经实现了可序列化。

请注意,您必须对模型对象属性使用var而不是val ,否则日志消息中的字段值将为空。

import org.springframework.web.bind.annotation.ModelAttribute
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RestController
import org.springframework.web.multipart.MultipartFile

@RestController
class ExampleController(private val myProfileRepository: ProfileRepository) {
    
    @PostMapping("/api/uploadFile")
    fun createProvider(@ModelAttribute request: CreateProfileRequest): Provider {
        println("received create request with photo: ${request.photo} for the following person ${request.name}")
        return myProfileRepository.save(Provider(name = request.name!!))
    }
}

data class CreateProfileRequest(
    var name: String? = null,
    var photo: MultipartFile? = null
)

嗨,人们只需更改:@RequestBody 到 @ModelAttribute

public ResponseEntity<DTO> exemple(@ModelAttribute Dto dto) throws TechnicalException

快乐编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM