java - 请求被拒绝,因为没有找到多部分边界 java
问题描述
我正在开发文件上传功能。为此,我有一个 Spring Boot Web 服务,并且客户端是有角度的。
网络服务:-
@PostMapping(value = "/sendmails", headers = "content-type=multipart/*", consumes = "application/*")
public ResponseEntity<String> sendEmails(@RequestParam("data") MultipartFile reapExcelDataFile) {
return new ResponseEntity("Success", HttpStatus.OK);
}
用户界面:-
postFile(fileToUpload: File): Observable<boolean> {
const endpoint = 'http://localhost:8080/sendmails';
debugger;
let config = {headers: new HttpHeaders({ 'Content-Type': 'multipart/form-data'})};
const formData: FormData = new FormData();
formData.append('data', fileToUpload);
return this.httpClient.post(endpoint, formData, config)
.pipe(map(() => { return true; }));
}
错误: -
2020-07-31 16:13:19.644 错误 13144 --- [nio-8080-exec-2] oaccC[.[.[/].[dispatcherServlet]:Servlet.service() 用于 servlet [dispatcherServlet] path [] 抛出异常 [请求处理失败;嵌套异常是 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request;嵌套异常是 java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: the request was denied because no multipart boundary was found] 根本原因
org.apache.tomcat.util.http.fileupload.FileUploadException:请求被拒绝,因为在 org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:834) 找不到多部分边界 ~[ tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256) ~[tomcat-embed-core-9.0.21 .jar:9.0.21] 在 org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280) ~[tomcat-embed-core-9.0.21.jar:9.0.21] 在 org .apache.catalina.connector.Request.parseParts(Request.java:2881) ~[tomcat-embed-core-9.0.21.jar:9.0.21] at org.apache.catalina.connector.Request.parseParameters(Request. java:3214) ~[tomcat-embed-core-9.0.21.jar:9.0.21] at org.apache.catalina.connector.Request.getParameter(Request.java:1116)〜[tomcat-embed-core-9.0.21.jar:9.0.21]在org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)〜[tomcat-embed-core-9.0.21 .jar:9.0.21] 在 org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] 在 org.springframework .web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain. java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0 .21.jar:9.0.21] 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) ~[spring-web-5.1.8 .RELEASE.jar:5.1.8.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.21.jar:9.0.21] at org .apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.21.jar:9.0.21] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve. java:202) ~[tomcat-embed-core-9.0.21.jar:9.0.21] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0. 21.jar:9.0.21] 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:92) [tomcat-embed-core-9.0.21.jar:9.0.21] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core- 9.0.21.jar:9.0.21] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache .coyote.http11.Http11Processor.service(Http11Processor.java:408) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [ tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 org .apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java :1149) [na:1.8.0_251] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251] 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable .run(TaskThread.java:61) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]运行(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251] 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat -embed-core-9.0.21.jar:9.0.21] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]运行(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.21.jar:9.0.21] 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_251] 在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_251] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat -embed-core-9.0.21.jar:9.0.21] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]21] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]21] 在 java.lang.Thread.run(Thread.java:748) [na:1.8.0_251]
如果我删除文件并给出一个字符串,那么调用就会进行。可能是什么问题。
解决方案
问题是我自己设置Content-Type
,让它空白。谷歌浏览器会为我做这件事。multipartContent-Type
需要知道文件边界,当您删除 时Content-Type
,Postman 会自动为您完成。
推荐阅读
- java - Program opening in CMD then closing immediately (java)
- sql-server - Save a Query as stored procedure and let it iterate through an array
- laravel - 无法使用 Vuetify 和 Laravel 读取未定义的属性“t”
- c - Using Recursion to find sum of applicable integers
- javascript - Node.js Mongodb 集成问题;。节省()
- python - 修改嵌套字典中的键和值,其中包含列表
- c# - 不正确的循环导致过多的记录时应该更少
- c++ - 在我给二维向量赋予第一个值后控制台关闭
- asp.net-core-webapi - 调试 asp.net 核心 web API
- python - 在 testing.postgresql 中,在 Docker 中找不到 initdb 命令