java - org.springframework.web.multipart.MultipartException:无法解析多部分 servlet 请求
问题描述
我正在使用 Spring Boot 2.0.0 将文件上传到服务器,但出现此错误:
servlet [dispatcherServlet] 在路径 [/project] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request;嵌套异常是 java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadException: Unexpected EOF read on the socket] 根本原因
java.io.EOFException:在 org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:722) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 处的套接字上读取了意外的 EOF org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer。 doRead(Http11InputBuffer.java:1072) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:140) ~[tomcat -embed-core-8.5.28.jar:8.5.28] 在 org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:261) ~[tomcat-embed-core-8.5.28.jar:8.5. 28] 在 org.apache.coyote.Request.doRead(Request.java:581) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.catalina.connector。InputBuffer.realReadBytes(InputBuffer.java:326) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:642) ~[tomcat -embed-core-8.5.28.jar:8.5.28] 在 org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:349) ~[tomcat-embed-core-8.5.28.jar:8.5. 28] 在 org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:183) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 java.io.FilterInputStream.read(FilterInputStream. java:133) ~[na:1.8.0_161] at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132) ~[tomcat-embed-core-8.5.28.jar :8.5.28] 在 org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:977) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.tomcat.util.http.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:881) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 java.io。 InputStream.read(InputStream.java:101) ~[na:1.8.0_161] at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98) ~[tomcat-embed-core -8.5.28.jar:8.5.28] 在 org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68) ~[tomcat-embed-core-8.5.28.jar: 8.5.28] 在 org.apache.tomcat.util.http.fileupload.MultipartStream.readBodyData(MultipartStream.java:572) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache。 tomcat.util.http.fileupload.MultipartStream.discardBodyData(MultipartStream.java:596) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.tomcat.util.http.fileupload.MultipartStream .skipPreamble(MultipartStream.java:614)~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.findNextItem(FileUploadBase.java:865)~[tomcat-embed -core-8.5.28.jar:8.5.28] 在 org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl.(FileUploadBase.java:845) ~[tomcat-embed-core-8.5.28.jar :8.5.28] 在 org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache .tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.connector.Request.parseParts( Request.java:2869) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.connector.Request.parseParameters(Request.java:第3216章~[tomcat-embed-core-8.5.28.jar:8.5.28]在org.apache.catalina.connector.Request.getParameter(Request.java:1137)~[tomcat-embed-core-8.5.28 .jar:8.5.28] 在 org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.springframework.web .filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:75) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java: 107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5 .28.jar:8.5.28] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.4.RELEASE .jar:5.0.4.RELEASE] 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在 org .apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain. java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-8.5 .28.jar:8.5.28] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.28 .jar:8.5.28] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.catalina。 Valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat -embed-core-8.5.28.jar:8.5.28] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.28.jar:8.5.28 ] 在 org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.28.jar:8.5.28] 在 org.apache.coyote。AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed -core-8.5.28.jar:8.5.28] 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.28.jar:8.5 .28] 在 org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.28.jar:8.5.28] 在 java.util.concurrent.ThreadPoolExecutor。 runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161] 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161] 在 org.apache.tomcat.util。 thread.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.28.jar:8.5.28] 在 java。lang.Thread.run(Thread.java:748) [na:1.8.0_161]
这是我的前端:
<form class="form" enctype="multipart/form-data" >
<div class="book__row form__group ">
<select id="dropdown-category" name="options" class="form__input" required>
<option value="0">Wählen Sie eine Kategorie aus</option>
</select>
</div>
<div class="book__row form__group ">
<select id="dropdown-subcategory" name="options" class="form__input" required>
</select>
</div>
<div class="form__group">
<input type="text" class="form__input form__input--blue-border" placeholder="NAME" id="filename" required>
<label for="title" class="form__label">NAME</label>
</div>
<div class="form__group">
<textarea id="description" class="form__input form__input--blue-border " rows="4" cols="50" name="comment" form="usrform"
required> BESCHREIBUNG
</textarea>
</div>
<div class="form__group input-file-container">
<input class="input-file" id="fileStream" type="file" required>
<label tabindex="0" for="my-file" class="input-file-trigger">Datei hochladen</label>
<p class="file-return"></p>
</div>
<div class=" form__group input-file-container" id="addBinaryDoc">
<input class="input-file" type="submit">
<label tabindex="0" for="form-btn" class="input-file-trigger">Dokument hinzufügen</label>
<p class="file-return"></p>
</div>
</form>
JS
var data = new FormData();
data.append("fileStream", file);
data.append("metadata", new Blob([JSON.stringify(doc)], { type: "application/json" }));
return $.ajax({
type: "POST",
url: '/my/path',
data: data,
enctype: 'multipart/form-data',
cache: false,
contentType: false,
processData: false
});
后端:我的控制器:
@RequestMapping(value = "save",headers = "content-type=multipart/*", method = { RequestMethod.POST
}, consumes = "multipart/form-data")
@ResponseBody
public void saveDocument(@RequestParam("fileStream") MultipartFile multipartFile,
@RequestPart(name = "metadata", required = false) @Valid Document uploadedDocument)
我还添加了一个多部分解析器
@Bean
public MultipartResolver multipartResolver() {
MultipartResolver resolver = new StandardServletMultipartResolver();
return resolver;
}
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("5120MB");
factory.setMaxRequestSize("5120MB");
return factory.createMultipartConfig();
}
application.properties
:
spring.servlet.multipart.max-file-size=5MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.enabled=true
雄猫context.xml
<Context allowCasualMultipartParsing="true" path="/">
<Resources cachingAllowed="true" cacheMaxSize="100000" />
</context>
雄猫web.xml
<session-config>
<session-timeout>60</session-timeout>
</session-config>
雄猫servlet.xml
<Connector port="1050"
maxThreads="400" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionUploadTimeout="36000000" connectionTimeout="60000" disableUploadTimeout="false"
/>
此错误的原因可能是什么?
解决方案
推荐阅读
- vector - Rust - 如何从函数返回多个变量,以便在调用函数的范围之外可以访问它们?
- python - 位置 args 元组的索引 1 超出范围
- julia - 如何用 Julia 绘制球体?
- rust - HashMap 的 split_at_mut 等价物?
- php - Laravel 关系将列组合到逗号分隔的字符串
- html - 应用时无法获得所需的字体样式
- java - Jboss 从 EAP 6.3 迁移到 EAP 7.3 - 资源适配器不工作
- python-3.x - 已安装的 PILLOW 模块未识别为在 Python 3 中导入
- overpass-api - 如何在 OSMnx 图中包含汽车轮渡
- javascript - 有没有办法忽略 rxjs 管道内的计时器?