当前位置: 首页 > 知识库问答 >
问题:

spring boot+多部分文件上载产生格式错误的多部分请求

赵涵亮
2023-03-14

我目前运行的是spring boot V1.3.0.build-Snapshot和spring V4.2.2.build-Snapshot。

如果我尝试执行多文件上载(通过angular):

myService.upload = function(name ,content) {
    var fd = new FormData();
    fd.append('name', name);
    fd.append('file', content);   

    return $http({
      method: 'POST',
      url: SERVER_BASE_URL + 'upload',
      data: fd,
      transformRequest: angular.identity,
      headers: {
        'Content-Type': 'multipart/form-data'
      }}).then(function(res) {       
        return res.headers('Location');
      }, function(reason) {
          throw reason;
      });
};

我得到了错误:

[WARN]org.eclipse.jetty.server.request-java.io.ioException:org.eclipse.jetty.util.multipartInputStreamParser.parse(multipartInputStreamParser.java:507)~org.eclipse.jetty.util.multipartInputStreamParser.getParts(multipartInputStreamParser.java:400)~org.eclipse.jetty.jetty.server.request.getParts(request)730.jar:9.2.13.v20150730]位于org.springframework.web.filter.hiddenHttpMethodFilter.doFilterInternal(hiddenHttpMethodFilter.java:70)[spring-web-4.2.2.build-Snapshot.jar:4.2.2.build-Snapshot]位于org.springframework.web.filter.oncePerRequestFilter.doFilter(oncePerRequestFilter.java:107)[spring-web-4.2.2.build-Snapshot]位于doHandle(servlethandler.ja[jettyservlet-9.2.13.v20150730.jar:9.2.13.v20150730]在org.eclipse.jetty.server.handler.scopedhandler.handle(scopedhandler.java:143)[jettyserver-9.2.13.v20150730.jar:9.2.13.v20150730]在v20150730.jar:9.2.13.v20150730]在org.eclipse.jetty.server.handler.scopedhandler.java:141)[JettyServer-9.2.13.v20150730.jar:9.2.13.v20150730]在org.eclipse.jetty.server.handler.handler.java:97)[JettyServer-9.2.13.v20150730.jar:9.2.13.v20150730]在org.eclipse.jetty.server.server.server.handl.server.499)[JettyServer-9.2.13.v20150730]在L.java:555)[JettyUTIL-9.2.13.v20150730.jar:9.2.13.30]1507 at java.lang.Thread.Run(Thread.java:745)[NA:1.8.0_45]

我添加了一个多部分解析器bean:

@Bean
public FilterRegistrationBean openEntityManagerFilterRegistrationBean() {
    // Set upload filter
    final MultipartFilter multipartFilter = new MultipartFilter();
    final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter);
    filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver");

    return filterRegistrationBean;
}

@Bean
public CommonsMultipartResolver commonsMultipartResolver() {
    final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
    commonsMultipartResolver.setMaxUploadSize(-1);

    return commonsMultipartResolver;
}

但是,似乎仍然在我的多部分解析程序之前调用hiddenHttpMethodFilter:

[DEBUG]org.eclipse.jetty.servlet.servlethandler-调用筛选器characterEncodingFilter[DEBUG]org.eclipse.jetty.servlet.servlethandler-调用筛选器hiddenHttpMethodFilter[WARN]org.eclipse.jetty.util.MultipartInputStreamParser-多部分请求格式错误

我尝试将@order(0)添加到Bean中,但没有效果。

我还错过了什么?

共有2个答案

濮阳旺
2023-03-14

这仅仅意味着您的angular js代码有问题。您将不得不在浏览器上调试,到底发送了什么,并且确定是缺少了头。使用像Firebug这样的工具。试试这个代码。

var fd = new FormData();
fd.append('file', file);
fd.append('data', 'string');
$http.post(uploadUrl, fd, {
   transformRequest: angular.identity,
   headers: {'Content-Type': undefined}
})
.success(function(){
})
.error(function(){
});

config对象的以下两个属性是绝对必要的:

transformRequest: angular.identity

覆盖Angular的默认序列化,保持数据不变。

headers: {'Content-Type': undefined }

允许浏览器将正确的内容类型检测为多部分/表单数据,并填写正确的边界。

马侯林
2023-03-14

我不使用筛选器上载文件。

请在此处尝试此方法:

// in configs
  @Bean
     Public MultipartConfigElement multipartConfigElement () {
         End MultipartConfigFactory factory = new MultipartConfigFactory ();
         Factory.setMaxFileSize ( "50MB");
         Factory.setMaxRequestSize ( "50MB");
         Return factory.createMultipartConfig ();
     }

而且

        // in controller
         @RequestMapping (value = "/ sendfile", method = RequestMethod.POST)
         Public ModelAndView formSubmit (@RequestParam ( "file") MultipartFile file) {

         }

注意:请记住删除配置中的筛选器

我希望能帮忙

 类似资料:
  • 我试图创建一个页面,用户可以张贴图像及其细节。现在,当我测试来自postman的spring boot服务时,我能够成功地在服务中获取文件。当我试图从angular5中做同样的事情时,多部分文件在服务中没有被识别,并且总是得到空数组。 我的角服务代码如下 } 我已经尝试添加标头,如multipart/form-data,并将其设置为un定义。无论哪种方式,我都收到了错误。在发布到这里之前,我已经广

  • 我试图写一个通用代码上传文件到任何服务器(多部分职位)。< br >我已经在我的代码和各种stackoverflow解决方案中尝试了不同的头和请求类型,但仍然无法上传任何文件。 我不断收到以下HTML消息作为响应: 400 BAD请求 如何在Android中编写一个通用代码将文件上传到服务器?< br > Android代码:< br > 用于测试文件上传的 PHP 代码:

  • 令牌检索都解决了。 我已经读过很多关于这个的文章,并且已经确保在有效负载之前有两个n。任何指示将非常感谢! 谢谢!

  • 我正在尝试用angularjs上传文件,但有一个问题是“当前请求不是多部分请求”,我几乎尝试了谷歌的所有解决方案,但都没有解决我的问题,希望有人能回答我的问题,谢谢。 这是我的springMVC配置 这是角控制器 这是角服务 这是上传控制器 表单数据 -----WebKitFormBoundaryRZP8MUHA8LCBDZDN 内容-处置:表单-数据;name=“文件”;filename=“1.

  • Im使用Spring Boot,并希望使用控制器接收多部分文件上传。当发送文件时,我一直得到错误415不支持的内容类型响应,并且控制器从未到达 我尝试在HTML/JSP页面和使用RESTTemplate的独立客户端应用程序中使用Form:Action发送。所有尝试的结果都是一样的 从multipart文档看来,边界参数必须添加到multipart上载,但这似乎与控制器接收不匹配 我的控制器方法设置

  • 关于Spring MVC应用程序中的多部分文件上传问题,我已经看到了很多关于stackoverflow的答案。我一步一步地确保我不会重复别人犯过的错误。 这是我的表格 在pom文件中我有依赖项 因此,当我停在调试器中时,request对象显示文件已被接收,甚至存储在jBoss临时文件夹中,我并不感到惊讶。 你能指出Spring看不到上传的文件我会错过什么吗?