MultipartException:当前请求不是多部分请求

Posted

技术标签:

【中文标题】MultipartException:当前请求不是多部分请求【英文标题】:MultipartException: Current request is not a multipart request 【发布时间】:2017-06-20 03:59:12 【问题描述】:

我正在尝试制作一个宁静的控制器来上传文件。我见过this 并制作了这个控制器:

@RestController
public class MaterialController 

    @RequestMapping(value="/upload", method= RequestMethod.POST)
    public String handleFileUpload(
            @RequestParam("file") MultipartFile file)
        String name = "test11";
        if (!file.isEmpty()) 
            try 
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));
                stream.write(bytes);
                stream.close();
                return "You successfully uploaded " + name + " into " + name + "-uploaded !";
             catch (Exception e) 
                return "You failed to upload " + name + " => " + e.getMessage();
            
         else 
            return "You failed to upload " + name + " because the file was empty.";
        
    

然后我用邮递员发送了一个pdf:

但服务器因错误而崩溃:

.MultipartException: Current request is not a multipart request

我又找到了this,并添加了一个bean.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    </bean>
</beans>

不幸的是,它仍然报同样的错误。

【问题讨论】:

不知道是不是你的问题,但是截图显示你没有命名part。根据您的handleFileUpload() 方法,您需要为part 指定名称/键值file。如果没有 part 名称,它可能不会向服务器发送任何内容,并且 "nothing" = "not multipart"。 不,您不需要创建目录。 Unrelated: 因为你用@RestController注释类,你不需要用@ResponseBody注释方法。请参阅 javadoc:docs.spring.io/spring/docs/current/javadoc-api/org/… 【参考方案1】:

我遇到了这个问题,但这是由于我在邮递员中上传的文件不在 邮递员工作目录 转到设置 -> 常规并向下滚动到位置以找到它的位置文件夹并将您的文件上传到那里。

见:Setup Potman working directory

【讨论】:

【参考方案2】:

您需要将 consumes = MULTIPART_FORM_DATA_VALUE 添加到您的映射中。完整示例:

@PostMapping(path = "/idDocument/attachments", consumes = MULTIPART_FORM_DATA_VALUE)
ResponseEntity<String> addAttachmentsToDocumentForm(@PathVariable Long idDocument, @RequestParam("file") MultipartFile[] files)
    documentService.addAttachments(idDocument, files);
    return ok("your response");

【讨论】:

【参考方案3】:

就我而言,我删除了:

“内容类型”:“应用程序/json”,

来自我的拦截器,一切正常。

     intercept(httpRequest: HttpRequest<any>, httpHandler: HttpHandler): Observable<HttpEvent<any>> 
if (this.authService.isUserLoggedIn() && httpRequest.url.indexOf('login') === -1) 
  const authReq = httpRequest.clone(
    headers: new HttpHeaders(
    'Content-Type': 'application/json',
      Authorization: this.authService.getBasicAuth()
    )
  );
  return httpHandler.handle(authReq);
 else 
  return httpHandler.handle(httpRequest);

【讨论】:

【参考方案4】:

这发生在我身上一次:我有一个完美运行的 Postman 配置,但随后,即使我没有在 Postman 上手动通知Content-Type,它也停止了工作;没有进行任何更改;按照这个问题的答案,我尝试禁用标题并让 Postman 自动添加它,但两个选项都不起作用。

我最终通过转到Body 选项卡来解决它,将参数类型从File 更改为Text,然后返回File,然后重新选择要发送的文件;不知何故,这使它再次起作用。闻起来像 Postman 虫子,在那种特定情况下,也许吧?

【讨论】:

【参考方案5】:

我遇到了与拼写错误的 enctype="multipart/form-data" 相同的问题,我通过正确的拼写修复了这个异常。 当前请求不是多部分请求客户端错误,因此请检查您的表单。

【讨论】:

【参考方案6】:

检查您在请求中选择的文件。

对我来说,我收到错误是因为系统中不存在该文件,因为我从其他机器导入了请求。

【讨论】:

我遇到了确切的问题!每个设置都是正确的 - 但有一件事:该文件不存在(不再存在)。而不是得到“找不到文件”(或类似的东西),我总是会得到Current request is not a multipart request【参考方案7】:

在 ARC(高级休息客户端)中 - 如下指定以使其工作 Content-Type multipart/form-data(这是标头名称和标头值) 这允许您将表单数据添加为键和值 您现在可以根据您的 REST 规范指定您的字段名称,然后从文件选择器中选择要上传的文件。

【讨论】:

【参考方案8】:

对于multipart,我也面临与Postman 相同的问题。我通过以下步骤修复了它:

不要在Headers 部分中选择Content-Type。 在PostmanBody 选项卡中,您应该选择form-data 并选择file type

它对我有用。

【讨论】:

【参考方案9】:

在 application.properties 中,请添加:

spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
spring.http.multipart.enabled=false

在您的 html 表单中,您需要一个:enctype="multipart/form-data"。 例如:

<form method="POST" enctype="multipart/form-data" action="/">

希望对您有所帮助!

【讨论】:

【参考方案10】:

当您使用 Postman 进行多部分请求时,请不要在 Header 中指定自定义 Content-Type。所以 Postman 中的 Header 选项卡应该是空的。邮递员将确定表单数据边界。在 Postman 的 Body 选项卡中,您应该选择 form-data 并选择文件类型。您可以在https://github.com/postmanlabs/postman-app-support/issues/576找到相关讨论

【讨论】:

我没听懂你。你能在邮递员中发送正确请求的图像吗? 检查 Postman 中正文选项卡之前的标题选项卡。您的请求是正确的,但由于您共享的图像显示 Headers(1),Headers 中有一些条目。从那里删除条目。【参考方案11】:

看起来问题是对服务器的请求不是多部分请求。基本上你需要修改你的客户端表单。例如:

<form action="..." method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
</form>

希望这会有所帮助。

【讨论】:

这是一个rest应用程序,目前还没有客户端的html。我用邮递员 @SalmanLashkarara,您仍然可以将其添加到您的其余客户端的标题中。

以上是关于MultipartException:当前请求不是多部分请求的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot当文件上传大小限制超过获取MultipartException而不是MaxUploadSizeExceededException

Spring Boot怎么处理上传文件时出现的MultipartException

如何在 Spring 中处理 MultipartException

如何在 Grails 3 中捕获“org.springframework.web.multipart.MultipartException”

Spring Boot怎么处理上传文件时出现的MultipartException

Spring Boot怎么处理上传文件时出现的MultipartException