java - org.apache.catalina.connector.RequestFacade 无法转换为 org.springframework.web.multipart.MultipartHttpServletRequest

标签 java angularjs spring spring-mvc

我有一个具有此类配置的网络应用程序。请查看 multipartResolver bean。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.websystique.springmvc")
public class HelloWorldConfiguration extends WebMvcConfigurerAdapter{

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }


    @Bean(name = "multipartResolver")
    public CommonsMultipartResolver multipartResolver() {

        final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(100000);

        return multipartResolver;
    }
}

我还有 Controller ,它应该接受来自客户端的文件

 @RequestMapping(value = "/file/", method = RequestMethod.POST)
    public ResponseEntity<Void> createUser(HttpServletRequest request) throws IOException {

        System.out.println("!!!");
        MultipartHttpServletRequest mRequest =
                (MultipartHttpServletRequest) request; // Exception is here
        //some code
    }

我在此 jsp 代码片段中发送文件

<input type="file" id="file" name="file" accept=".xls,.xlsx" enctype="multipart/form-data" />
          <button ng-click="ctrl.add()">Add</button>

通过这个 Angular 代码

function functionAdd() {
        var f = document.getElementById('file').files[0];
        var fd = new FormData();

        fd.append("file", f);
        return $http.post(REST_SERVICE_URI1, fd);
    }

我有这个堆栈跟踪。

java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:410)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:383)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)

也许有人能发现错误。

最佳答案

如何使用 $http 服务发布 FormData

使用 FormData API 时要 POST 文件和数据,设置 Content-Type header 很重要到未定义

var fd = new FormData()
for (var i in $scope.files) {
    fd.append("fileToUpload", $scope.files[i]);
}
var config = {headers: {'Content-Type': undefined}};

var httpPromise = $http.post(url, fd, config);

默认情况下,AngularJS 框架使用内容类型 application/json。通过设置 Content-Type: undefined,AngularJS 框架会忽略内容类型 header ,从而允许 XHR API设置内容类型。发送 FormData object 时,XHR API 将内容类型设置为 multipart/form-data 并具有适当的边界和 base64编码。

有关详细信息,请参阅 MDN Web API Reference - XHR Send method

<小时/>

Can you explain why it isn't proper to use multipart/form-data? instead of undefined.

multipart/form-data 没有正确的边界会导致问题。 XHR send() API自动设置边界并将其包含在每个部分中。

通过设置 Content-Type: undefined,AngularJS 框架会忽略内容类型 header ,从而允许 XHR API设置内容类型。发送 FormData object 时,XHR API 将内容类型设置为 multipart/form-data 并具有适当的边界和 base64编码。

有关详细信息,请参阅 What is the boundary in multipart/form-data?

关于java - org.apache.catalina.connector.RequestFacade 无法转换为 org.springframework.web.multipart.MultipartHttpServletRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47979651/

相关文章:

java - 未定义名为 Bean 的异常

java - 字符串索引越界异常错误

java - 单击 JLabel 运行方法

java - 支持 "PATCH"动词 - WSHttpHandler handleExchange 给出警告 : Cannot handle HTTP method: PATCH

javascript - 是否有用于阅读更多/更少文本的基本 Angular Directive(指令)

javascript - 从 ngModel 更新 JSON 元素,然后使用 http POST

javascript - 具有多种模式的 ng-file-upload

java - 简单的 Java 网络服务

java - 使用@secured方法时为"An Authentication object was not found in the SecurityContext"

Spring @Autowired 不工作