springmvc上传多个文件无法使用缓存

水之笔记 发布于 2017/03/19 00:44
阅读 200
收藏 1

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

这个异常,但是很奇怪的是只有使用断点的时候才能看到,我正常的日志不显示这个异常

加载中
返回顶部
顶部