请求被拒绝,因为未找到多部分边界。

huangapple go评论107阅读模式
英文:

the request was rejected because no multipart boundary was found java

问题

我正在开发文件上传功能。为此,我有一个Spring Boot Web服务,客户端是Angular。

Web服务:-

  1. @PostMapping(value = "/sendmails", headers = "content-type=multipart/*", consumes = "application/*")
  2. public ResponseEntity<String> sendEmails(@RequestParam("data") MultipartFile reapExcelDataFile) {
  3. return new ResponseEntity("Success", HttpStatus.OK);
  4. }

UI:-

  1. postFile(fileToUpload: File): Observable<boolean> {
  2. const endpoint = 'http://localhost:8080/sendmails';
  3. debugger;
  4. let config = {headers: new HttpHeaders({ 'Content-Type': 'multipart/form-data'})};
  5. const formData: FormData = new FormData();
  6. formData.append('data', fileToUpload);
  7. return this.httpClient.post(endpoint, formData, config)
  8. .pipe(map(() => { return true; }));
  9. }

错误:-

  1. > 2020-07-31 16:13:19.644 ERROR 13144 --- [nio-8080-exec-2]
  2. > o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for
  3. > servlet [dispatcherServlet] in context with path [] threw exception
  4. > [Request processing failed; nested exception is
  5. > org.springframework.web.multipart.MultipartException: Failed to parse
  6. > multipart servlet request; nested exception is java.io.IOException:
  7. > org.apache.tomcat.util.http.fileupload.FileUploadException: the
  8. > request was rejected because no multipart boundary was found] with
  9. > root cause
  10. >
  11. > org.apache.tomcat.util.http.fileupload.FileUploadException: the
  12. > request was rejected because no multipart boundary was found at
  13. > org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:834)
  14. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  15. > org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)
  16. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  17. > org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)
  18. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  19. > org.apache.catalina.connector.Request.parseParts(Request.java:2881)
  20. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  21. > org.apache.catalina.connector.Request.parseParameters(Request.java:3214)
  22. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  23. > org.apache.catalina.connector.Request.getParameter(Request.java:1116)
  24. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  25. > org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)
  26. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  27. > org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84)
  28. > ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  29. > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109)
  30. > ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  31. > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  32. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  33. > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  34. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  35. > org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
  36. > ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  37. > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109)
  38. > ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  39. > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  40. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  41. > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  42. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  43. > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
  44. > ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  45. > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  46. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  47. > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
  48. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  49. > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
  50. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  51. > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
  52. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  53. > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
  54. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  55. > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
  56. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  57. > org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
  58. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  59. > org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  60. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  61. > org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
  62. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  63. > org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
  64. > [tomcat-embed-core-9.0.21.jar:9.0.21] at
  65. > org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  66. >
  67. <details>
  68. <summary>英文:</summary>
  69. I am developing a file upload functionality. for that I have a spring boot web service and client is angular.
  70. **Webservice:-**
  71. @PostMapping(value = &quot;/sendmails&quot;, headers = &quot;content-type=multipart/*&quot;, consumes = &quot;application/*&quot;)
  72. public ResponseEntity&lt;String&gt; sendEmails(@RequestParam(&quot;data&quot;) MultipartFile reapExcelDataFile) {
  73. return new ResponseEntity(&quot;Success&quot;, HttpStatus.OK);
  74. }
  75. **UI: -**
  76. postFile(fileToUpload: File): Observable&lt;boolean&gt; {
  77. const endpoint = &#39;http://localhost:8080/sendmails&#39;;
  78. debugger;
  79. let config = {headers: new HttpHeaders({ &#39;Content-Type&#39;: &#39;multipart/form-data&#39;})};
  80. const formData: FormData = new FormData();
  81. formData.append(&#39;data&#39;, fileToUpload);
  82. return this.httpClient.post(endpoint, formData, config)
  83. .pipe(map(() =&gt; { return true; }));
  84. }
  85. **ERROR: -**
  86. &gt; 2020-07-31 16:13:19.644 ERROR 13144 --- [nio-8080-exec-2]
  87. &gt; o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for
  88. &gt; servlet [dispatcherServlet] in context with path [] threw exception
  89. &gt; [Request processing failed; nested exception is
  90. &gt; org.springframework.web.multipart.MultipartException: Failed to parse
  91. &gt; multipart servlet request; nested exception is java.io.IOException:
  92. &gt; org.apache.tomcat.util.http.fileupload.FileUploadException: the
  93. &gt; request was rejected because no multipart boundary was found] with
  94. &gt; root cause
  95. &gt;
  96. &gt; org.apache.tomcat.util.http.fileupload.FileUploadException: the
  97. &gt; request was rejected because no multipart boundary was found at
  98. &gt; org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.&lt;init&gt;(FileUploadBase.java:834)
  99. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  100. &gt; org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)
  101. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  102. &gt; org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)
  103. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  104. &gt; org.apache.catalina.connector.Request.parseParts(Request.java:2881)
  105. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  106. &gt; org.apache.catalina.connector.Request.parseParameters(Request.java:3214)
  107. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  108. &gt; org.apache.catalina.connector.Request.getParameter(Request.java:1116)
  109. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  110. &gt; org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)
  111. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  112. &gt; org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84)
  113. &gt; ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  114. &gt; org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109)
  115. &gt; ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  116. &gt; org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  117. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  118. &gt; org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  119. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  120. &gt; org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
  121. &gt; ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  122. &gt; org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109)
  123. &gt; ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at
  124. &gt; org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
  125. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  126. &gt; org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
  127. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  128. &gt; org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
  129. &gt; ~[tomcat-embed-core-9.0.21.jar:9.0.21] at
  130. &gt; org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
  131. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  132. &gt; org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
  133. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  134. &gt; org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
  135. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  136. &gt; org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
  137. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  138. &gt; org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
  139. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  140. &gt; org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
  141. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  142. &gt; org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
  143. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  144. &gt; org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
  145. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  146. &gt; org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
  147. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  148. &gt; org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
  149. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  150. &gt; org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
  151. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  152. &gt; java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  153. &gt; [na:1.8.0_251] at
  154. &gt; java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  155. &gt; [na:1.8.0_251] at
  156. &gt; org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  157. &gt; [tomcat-embed-core-9.0.21.jar:9.0.21] at
  158. &gt; java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]
  159. If I remove the file and give a string then the call is going. What might be the issue.
  160. </details>
  161. # 答案1
  162. **得分**: 0
  163. 问题在于我自己设置了`Content-Type`,让它保持空白。Google Chrome会为我完成这个操作。多部分`Content-Type`需要知道文件边界,当你移除`Content-Type`时,Postman会自动为你完成。
  164. <details>
  165. <summary>英文:</summary>
  166. The problem is that I am setting the `Content-Type` by myself, let it be blank. Google Chrome will do it for me. The multipart `Content-Type` needs to know the file boundary, and when you remove the `Content-Type`, Postman will do it automagically for you.
  167. </details>
  168. # 答案2
  169. **得分**: 0
  170. If you are using angular 15+ with restful spring api, I did encapsulate the file in ***FormData*** object and it worked :
  171. const formData = new FormData();
  172. formData.append("file", file, file.name);
  173. return this.http.post<any>(`${env.apiUrl}/controllerUrl/uploadFile`, formData);
  174. <details>
  175. <summary>英文:</summary>
  176. If you are using angular 15+ with restful spring api, I did encapsulated the file in ***FormData*** object and it worked :
  177. const formData = new FormData();
  178. formData.append(&quot;file&quot;, file, file.name);
  179. return this.http.post&lt;any&gt;(`${env.apiUrl}/controllerUrl/uploadFile`, formData);
  180. </details>

huangapple
  • 本文由 发表于 2020年7月31日 18:42:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/63190354.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定