org.apache.catalina.connector.RequestFacade 不能转换为 org.springframework.web.multipart.MultipartHttpServletRequest

亚历克斯

我有一个具有此类配置的网络应用程序。请看 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;
    }
}

我也有控制器,它应该接受来自客户端的文件

 @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>

通过这个角度代码

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 服务 POST FormData

使用FormData API POST 文件和数据时,将Content-Type 标头设置undefined.

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 框架省略了允许XHR API设置内容类型的内容类型标头发送FormData 对象时,XHR API 将内容类型设置为multipart/form-data具有适当的边界和base64编码。

有关更多信息,请参阅MDN Web API 参考 - XHR 发送方法


你能解释为什么它不适合使用multipart/form-data吗?而不是undefined.

multipart/form-data没有适当的界限会导致问题。XHR的send()API自动设置边界,并且包括将其与每个部分。

通过设置Content-Type: undefined,AngularJS 框架省略了允许XHR API设置内容类型的内容类型标头发送FormData 对象时,XHR API 将内容类型设置为multipart/form-data具有适当的边界和base64编码。

有关更多信息,请参阅multipart/form-data 中的边界是什么?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章