SpringMVC在做文件上传,我现在需要做的一个工程要求一次能够分开上传三个文件
同时文件2,文件3有可能不上传任何东西
我现在的写法是用了一个form表单提交,表单内有三个
<input type="file" name="file1" id="file1">
每个的name各不相同
后台接受的时候使用三个requestParam来接受,如下图(第三个参数没写与前面相同)
@RequestParam(value = "file1", required = false) MultipartFile file1, @RequestParam(value = "file2", required = false) MultipartFile file2
然后判断file2和file3是否为空,不为空的话将文件保存起来。
这个方法在测试的时候没有太大问题,但是到了实际使用的时候出现问题了,就是如果第一个文件的大小超过了SpringMVC缓存内存的大小的话,就会报错,错误报的很丰富,每次都不一样。。
这个是第一次上传的时候报的错误
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
如果我要是第一个文件传小于100字节的内容就没有任何的问题,后面不管文件2文件3传传多大的都没有问题
但是如果要是第一个大一点的话就会报错,上传路径里面只会生成一个空的该文件名字的文件夹
现在测试过的结果是,文件大一点就会报错,小的话不会报错,如果说form表单里面只写一个input file的话提交文件多大都不会报错,但是如果有多个input file,第一个文件过大就不行了。但是多个的时候都能够在controller里面正常的获取到他们的名字,文件的大小,都是正确的。但是使用上传就崩了。。。
我现在的临时解决方法是把缓存内存大小的限制调的很大,但这终归不是一个很好用的方法。所以想问问各位有没有什么别的解决方法
附上我的spring配置
<!-- springmvc文件上传需要配置的节点-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="-1"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="false"/>
<property name="uploadTempDir" value="/statics/document/tempdir"/>
<!--<property name="maxInMemorySize" value="104857600"/>-->
</bean>
文件上传代码:
public MessageCarrier upload(MultipartFile file, String path) {
MessageCarrier messageCarrier = new MessageCarrier();
String fileName = file.getOriginalFilename();
System.err.println("FilesUpload=============" + path);
File targetFile = new File(path, fileName);
/* File file1=new File(path);
if (!file1.isDirectory()){
file1.mkdirs();
}*/
if (!targetFile.exists()) {
targetFile.mkdirs();
try {
file.transferTo(targetFile);
messageCarrier.setMessageContent("OK");
} catch (IOException e) {
e.printStackTrace();
messageCarrier.setMessageContent("ERROR");
}
} else {
// System.err.println("该文件已经存在");
messageCarrier.setMessageContent("fileHasExists");
}
return messageCarrier;
}
controller的方法参数
public MessageCarrier worksInsert(@RequestParam(value = "file1", required = false) MultipartFile file1, @RequestParam(value = "file2", required = false) MultipartFile file2, @RequestParam(value = "file3", required = false) MultipartFile file3, HttpServletRequest request) {
}
这句上面,但是不知道为什么只要是使用缓存就不行了,我是接收到file之后分别调用三次 上传文件的方法,将文件上传到制定的路径里面去的
打断点,发现是在
file.transferTo(targetFile);
这个里面抛出了
java.lang.reflect.InvocationTargetException
这个异常,但是很奇怪的是只有使用断点的时候才能看到,我正常的日志不显示这个异常