jfinal-文件上传-问题记录
参考官方文档编写文件上传代码,相同的代码,上传图片和文档都正常,但是上传视频出现异常
java.lang.RuntimeException: java.io.IOException: Corrupt form data: premature ending
编写代码
package com.litongjava.jfinal.controler; import com.jfinal.core.Controller; import com.jfinal.kit.Kv; import com.jfinal.upload.UploadFile; public class UploadController extends Controller { /** * 上传文件 */ public void index() { UploadFile uploadFile = getFile(); String uploadPath = uploadFile.getUploadPath(); String fileName = uploadFile.getFileName(); String contentType = uploadFile.getContentType(); String originalFileName = uploadFile.getOriginalFileName(); String parameterName = uploadFile.getParameterName(); Kv kv = Kv.create(); kv.set("uploadPath", uploadPath); kv.set("fileName", fileName); kv.set("contentType", contentType); kv.set("originalFileName", originalFileName); kv.set("parameterName", parameterName); renderJson(kv); } }
使用Postman测试,调用接口上传一个文档,上传成功
再测试一张图片,上传成功
测试视频上传,出现下面的错误
异常信息
2021-12-06 11:27:12.044 [main] INFO Application.main:37 - create server 2021-12-06 11:27:12.064 [main] INFO Application.main:41 - start server Starting JFinal 4.9.16 -> http://0.0.0.0:10043/litongjava-jfinal-ffmpeg-server Info: jfinal-undertow 2.7, undertow 2.2.9.Final, jvm 1.8.0_121 2021-12-06 11:27:12.247 [main] INFO undertow.start:120 - starting server: Undertow - 2.2.9.Final 2021-12-06 11:27:12.256 [main] INFO xnio.<clinit>:95 - XNIO version 3.8.4.Final 2021-12-06 11:27:12.265 [main] INFO nio.<clinit>:58 - XNIO NIO Implementation Version 3.8.4.Final 2021-12-06 11:27:12.450 [main] INFO threads.<clinit>:52 - JBoss Threads version 3.1.0.Final Starting Complete in 0.4 seconds. Welcome To The JFinal World (^_^) http://10.11.63.222:10043/litongjava-jfinal-ffmpeg-server http://10.11.63.222:10043/litongjava-jfinal-ffmpeg-server 启动完成,共使用了446ms java.lang.RuntimeException: java.io.IOException: Corrupt form data: premature ending at com.jfinal.upload.MultipartRequest.wrapMultipartRequest(MultipartRequest.java:126) at com.jfinal.upload.MultipartRequest.<init>(MultipartRequest.java:68) at com.jfinal.core.Controller.getFiles(Controller.java:868) at com.jfinal.core.Controller.getFile(Controller.java:873) at com.litongjava.jfinal.controler.UploadController.index(UploadController.java:13) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.jfinal.aop.Invocation.invoke(Invocation.java:97) at com.litongjava.jfinal.interceptor.ExceptionInterceptor.intercept(ExceptionInterceptor.java:23) at com.jfinal.aop.Invocation.invoke(Invocation.java:91) at com.jfinal.core.ActionHandler.handle(ActionHandler.java:96) at com.litongjava.jfinal.handler.ActionSuffixHandler.handle(ActionSuffixHandler.java:28) at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:90) at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61) at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131) at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77) at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) at io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:119) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:280) at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134) at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:260) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852) at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558) at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423) at org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1280) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: Corrupt form data: premature ending at com.oreilly.servlet.multipart.MultipartParser.<init>(MultipartParser.java:207) at com.oreilly.servlet.MultipartRequest.parse(MultipartRequest.java:238) at com.oreilly.servlet.MultipartRequest.<init>(MultipartRequest.java:180) at com.jfinal.upload.MultipartRequest.wrapMultipartRequest(MultipartRequest.java:107) ... 50 more 2021-12-06 11:27:16.541 [XNIO-1 task-2] ERROR ExceptionInterceptor.intercept:26 - java.io.IOException: Corrupt form data: premature ending
同样都是视频流,为什么偏偏就视频出现异常呢?
没有找到原因是是什么,换一种接收上传文件的方式,使用commons-fileupload接收
修改代码后上传成功
添依赖
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
编写代码
package com.litongjava.jfinal.controler; import java.io.File; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.servlet.ServletRequestContext; import com.jfinal.core.Controller; import com.jfinal.kit.Kv; import com.jfinal.upload.UploadFile; public class UploadController extends Controller { /** * 上传文件 */ public void index() { HttpServletRequest request = getRequest(); ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory()); List<FileItem> fileItemList = null; try { fileItemList = servletFileUpload.parseRequest(new ServletRequestContext(request)); } catch (FileUploadException e1) { e1.printStackTrace(); return; } Kv kv = Kv.create(); for (FileItem fileItem : fileItemList) { String name = fileItem.getName(); String fieldName = fileItem.getFieldName(); kv.set("fileName", name); kv.set("fieldName", fieldName); System.out.println(name);// 上传的文件名 System.out.println(fieldName);// input元素中name值 try { File file = new File(name); fileItem.write(file); System.out.println(file.getAbsolutePath()); } catch (Exception e) { e.printStackTrace(); } } renderJson(kv); } public void v1() { UploadFile uploadFile = getFile(); String uploadPath = uploadFile.getUploadPath(); String fileName = uploadFile.getFileName(); String contentType = uploadFile.getContentType(); String originalFileName = uploadFile.getOriginalFileName(); String parameterName = uploadFile.getParameterName(); Kv kv = Kv.create(); kv.set("uploadPath", uploadPath); kv.set("fileName", fileName); kv.set("contentType", contentType); kv.set("originalFileName", originalFileName); kv.set("parameterName", parameterName); } }
测试上传成功