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

时间:2017-02-02 21:58:01

标签: java spring rest

我正在尝试制作一个安静的控制器来上传文件。我看过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:

enter image description here

但服务器因错误而崩溃:

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

不幸的是,仍然抱怨同样的错误。

11 个答案:

答案 0 :(得分:31)

当您使用Postman进行多部分请求时,请勿在标题中指定自定义内容类型。所以Postman中的Header选项卡应为空。邮差将确定表格数据边界。在Postman的Body选项卡中,您应该选择form-data并选择文件类型。您可以在https://github.com/postmanlabs/postman-app-support/issues/576

找到相关的讨论

答案 1 :(得分:5)

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

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

希望这有帮助。

答案 2 :(得分:2)

Postman multipart也遇到了同样的问题。我通过执行以下步骤修复它:

  • 请勿在{{1​​}}部分选择Content-Type
  • Headers的{​​{1}}标签中,您应选择Body并选择Postman

它对我有用。

答案 3 :(得分:2)

就我而言,我删除了:

<块引用>

'Content-Type': 'application/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 :(得分:1)

在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="/">

希望这有帮助!

答案 5 :(得分:1)

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

对我来说,我收到错误消息是因为该文件不存在于系统中,因为我已从其他计算机上导入了请求。

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

您需要将 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");
}

答案 10 :(得分:0)

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

见:Setup Potman working directory