java - Spring 文件上传的问题

标签 java spring file-upload spring-mvc

我有以下代码块,用于处理我在 Spring MVC Web 应用程序中使用的照片的文件上传。我正在使用 Spring MVC CommonsMultipartFileResolver 来处理文件上传。

if(model.getPhoto() != null){
    if(!model.getPhoto().isEmpty()){
        MultipartFile file = model.getPhoto();
        String fileName = file.getOriginalFilename();
        String filePath = baseDirectory + fileName;
        FileOutputStream fos = new FileOutputStream(filePath);
         try 
         {
            fos.write(file.getBytes());
            agentProfile.setPhotoUri(fileName);
         } 
         catch (IllegalStateException e) 
         {
            System.out.println(e);

         }
         finally   
         {
             fos.close();
         }
    }
}

在我的 app-servlet.xml 文件中,我有以下代码来配置 MultipartFile 解析器 bean。

 <bean id="multipartResolver"   class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
 </bean>

我在上传照片时遇到了一些随机问题。

1)如果我去上传一张小一点的照片,大约3kb左右,它会上传成功。

2)如果我去上传一张大一点的照片,它会在目录中创建文件,但大小为 0 字节,并会给出以下错误消息。

 java.lang.IllegalStateException: File has been moved - cannot be read again
org.springframework.web.multipart.commons.CommonsMultipartFile.getBytes(CommonsMultipartFile.java:112)
com.mmz.admin.mvc.controller.AddAgentController.processFinish(AddAgentController.java:145)
org.springframework.web.servlet.mvc.AbstractWizardFormController.validatePagesAndFinish(AbstractWizardFormController.java:642)
org.springframework.web.servlet.mvc.AbstractWizardFormController.processFormSubmission(AbstractWizardFormController.java:492)
org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:265)
org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:874)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:441)
javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

我尝试了几个不同的选项来配置 Multipart 解析器,例如将其切换为处理 CommonsMultipartFile 对象而不是普通的 MultipartFile 对象,但没有任何改变。

我还尝试使用以下属性在 CommonsMultipartFileResolver bean 中手动配置最大上传大小。

 <property name="maxUploadSize" value="1024000000"/>  

也没有任何改变。我不确定 CommonsMultipartResolver 默认的可上传文件大小是多少,但这不是我的问题。

有人告诉我,我遇到的问题是由于 spring 使用的多部分解析器/处理程序中的问题。我最近有一篇关于同样问题的帖子,因为发现了新信息,所以想用新信息重新发布。旧帖子可以在CommonsMultipartFileResolver Problem找到。

我觉得我已经检查了 Internet 上的几乎所有资源以查找其他文档,但我无法找出问题所在。

请帮我弄清楚这是怎么回事,如果有更好的、更简单的解决方案来探索这些选项,但如果可以的话,我宁愿继续使用我目前的方法找到解决方案。

编辑 注意-我一直在尝试上传不同尺寸的照片,我相信它允许我上传的限制在 10Kb 左右。任何大于 10Kb 的东西都会导致它崩溃并给我上面的错误。

最佳答案

经过大量研究,我解决了我的问题。事实证明,没有为您可以使用 CommonsMultipartFileResolver 上传的最大字节数设置默认限制当然,您可以通过设置以下属性在您的 bean 中指定您想要的任何数量。

<property name="maxUploadSize" value="99999999999"/>

还有一个属性 maxInMemorySize 允许您指定文件写入磁盘之前允许的最大大小。尽管这与最大上传大小的工作方式相同,但如果您未指定数量,则默认为 1024 字节。如果我尝试上传大文件,这可以解释它会中断。

为了允许上传超过 1024 字节的文件,您需要将 maxInMemorySize 值增加到您需要的值,如下所示...

这就是解决我的问题的原因。当我查看 CommonsFileUpload Documentation 的文档时,我了解到此属性默认为 1024。

您可以在 CommonsFileUpload Documentation 查看此文档

我希望这对任何人都有帮助,因为关于使用 CommonsMultipartFile 的文档不是很好。

关于java - Spring 文件上传的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3747430/

相关文章:

java - bufferedReader 关闭文件

java - 将 jsf 1.2 迁移到 2.0 时出错

java - 将 spring mvc 添加到 spring java "desktop"应用程序

java.lang.OutOfMemory错误:Java heap Space error after building app in Jenkins

java - ORA-01861 : literal doesn't match format string

java - spring hibernate乐观锁问题

spring - 加载类路径中 jar 内的 spring 应用程序上下文文件

javascript - 上传后如何用javascript显示文件名

PHP上传的图片被截断

javascript - 在将多个文件上传到服务器之前验证多个文件上传中的单个文件