【问题标题】:Spring Boot - Multipart - Unsupported Media TypeSpring Boot - 多部分 - 不支持的媒体类型
【发布时间】:2019-07-01 17:17:42
【问题描述】:

我想在一个 post 请求中发送一个文件和一个 json 模型。

我的请求映射如下所示:

    @PostMapping("{id}/files")
    public MyOutput create(@PathVariable String id, @RequestPart("request") MyInput input, @RequestPart("file") MultipartFile file) {
    // ...
    }

我收到的错误:

{
    "timestamp": "Feb 7, 2019, 3:18:50 PM",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/octet-stream' not supported",
    "trace": "org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/octet-stream' not supported...,
    "path": "/tests/12345/files"
}

邮递员要求: http://imgshare.free.fr/uploads/62f4cbf671.jpg

我的网络配置:

    @Override
    public void configureMessageConverters(final List<HttpMessageConverter<?>> converters) {

        GsonBuilder builder = new GsonBuilder();
        Gson gson = builder.setPrettyPrinting().create();

        final GsonHttpMessageConverter msgConverter = new GsonHttpMessageConverter();
        msgConverter.setGson(gson);
        msgConverter.setDefaultCharset(StandardCharsets.UTF_8);
        converters.add(msgConverter);

        converters.add(new StringHttpMessageConverter());

        //
        converters.add(new ByteArrayHttpMessageConverter());
        converters.add(new FormHttpMessageConverter());
        converters.add(new ResourceHttpMessageConverter());

    }

【问题讨论】:

标签: java rest spring-boot


【解决方案1】:

你可以试试用这个代替

@RequestPart("file") MultipartFile file

使用这个

@RequestParam(value = "file",required = false) MultipartFile file

并确保将请求类型设置为 multipart/form-data 您可以在标题选项卡中通过邮递员进行设置。

如果您需要将另一个对象与多部分文件一起发送,您可以将其作为字符串发送,然后您可以将其转换为后端的对象。

  @PostMapping("/upload")
    public void uploadFile(@Nullable @RequestParam(value = "file",required = false) MultipartFile file,
                                            @RequestParam(value = "input", required = false) String st)
    {
        ObjectMapper om = new ObjectMapper();
        MyInput input = null;
        try {
            input = om.readValue(st, MyInput.class);   //string st -> MyInput input
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

邮递员请求示例:

【讨论】:

  • 还有一件事:只需将 MyInput 对象的类型更改为字符串并将变量名称定义为值,如 @RequestParam(value = "request") String input
  • 是的,这行得通,我知道,但是没有办法使用 MyInput 代替 String 吗?
  • 我不知道它是否有帮助,但我更新了答案。我在我公司的专业项目中使用它。
  • 关于如何上传多个包含内容的多部分文件有什么想法吗?使用@RequestParam(value = "files",required = false) MultipartFile[] files 似乎不起作用。这样做时,我在files 中得到了空值。
猜你喜欢
  • 2017-09-22
  • 2021-04-09
  • 2020-06-26
  • 2021-12-21
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多