簡體   English   中英

org.apache.catalina.connector.RequestFacade無法轉換為org.springframework.web.multipart.MultipartHttpServletRequest

[英]org.apache.catalina.connector.RequestFacade cannot be cast to 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服務發布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將內容類型設置為具有適當邊界和base64編碼的multipart/form-data

有關更多信息,請參見MDN Web API參考-XHR Send方法


您能解釋為什么使用multipart/form-data嗎? 而不是undefined

沒有適當邊界的multipart/form-data會引起問題。 XHR send()API自動設置邊界並將其包含在每個部分中。

通過設置Content-Type: undefined ,AngularJS框架將省略內容類型標頭,從而允許XHR API設置內容類型。 發送FormData對象時 ,XHR API將內容類型設置為具有適當邊界和base64編碼的multipart/form-data

有關更多信息,請參見multipart / form-data中的邊界是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM