HttpMediaTypeNotSupportedException:不支持内容类型“应用程序/表单数据”spring-boot

Posted

技术标签:

【中文标题】HttpMediaTypeNotSupportedException:不支持内容类型“应用程序/表单数据”spring-boot【英文标题】:HttpMediaTypeNotSupportedException: Content type 'application/form-data' not supported spring-boot 【发布时间】:2021-06-11 16:13:45 【问题描述】:

在 Jhipster 上配置这些文件 application.yml、application-dev.yml、application-prod.yml 后:

spring:
    application:
        name: xxx
    http:
        multipart:
            enabled: true
            max-file-size: 200MB
            file-size-threshold: 2MB
            max-request-size: 215MB

我得到了错误:

        at org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping.handleNoMatch(RequestMappingInfoHandlerMapping.java:221)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:374)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:314)
        at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:61)
        at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:352)
        at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1160)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:940)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

这是我的控制器的示例:

    package com.xxx.xxx.web.rest;
    
    import com.xxx.xxx.service.FileUploadDownloadService;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.core.io.Resource;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    import java.net.MalformedURLException;
    
    @RestController
    @RequestMapping("/api")
    public class FileUploadDownloadController 
    
        private static final Logger logger = LoggerFactory.getLogger(FileUploadDownloadController.class);
    
        private final FileUploadDownloadService service;
    
        public FileUploadDownloadController(FileUploadDownloadService fileUploadDownloadService) 
            this.service = fileUploadDownloadService;
        
    
        @PostMapping(value = "/file/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
        public UploadFileResponse uploadFile(
            @RequestParam("filename") String name,
            @RequestParam("file") MultipartFile file) 
            String fileName = service.uploadFile(file);
    
            return new UploadFileResponse(fileName);
        
    

这是我要上传的 Angular 服务:

    import Injectable from '@angular/core';
    import Observable from 'rxjs/Rx';
    import Headers, Http, RequestOptions from '@angular/http';
    
    @Injectable()
    export class FileService 
    
        private resourceUrl = 'api/file';
    
        constructor(private http: Http) 
        
    
        uploadSingleFile(file: File): Observable<any> 
            const formData: FormData = new FormData();
            formData.append('file', file);
    
            const headers = new Headers();
            headers.append('Content-Type', 'application/form-data');
    
            const options = new RequestOptions( headers );
    
            console.log(formData);
            return this.http.post(`$this.resourceUrl/uploadFile`, formData, options );
        
    

我的spring-boot版本是1.5.4.RELEASE, Java 版本 1.8.0_275, 节点版本 10.17, JHipster 版本 4.6.0

我读过很多帖子,所有帖子都说我做过的相同配置(启用多部分支持),有什么我被误解或忘记的吗?

感谢您的支持。

【问题讨论】:

在 Spring 中,您期望内容类型为“multipart/form-data”,但您正在从 angular 发送“application/form-data”。您是否尝试过在 Angular 中使用“multipart/form-data”? 是的,其实这个内容类型好像是不存在的,developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/… 又看了另一篇帖子,发现不需要指明multipart/form-data,因为浏览器会推断内容。 【参考方案1】:

在阅读了一些帖子后,我发现没有必要指示内容类型如果您尝试发送 multipart/form-data,并且我尝试发送的内容类型不正确,因为不存在所以我已经删除该行:

headers.append('Content-Type', 'application/form-data');

原来如此。我希望这可以帮助某人。

问候。

【讨论】:

以上是关于HttpMediaTypeNotSupportedException:不支持内容类型“应用程序/表单数据”spring-boot的主要内容,如果未能解决你的问题,请参考以下文章