Spring FileUpload问题


问题内容

我有以下代码块正在处理我在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)如果我要上传较小的照片,大约3 kb左右,它将成功上传。

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正在使用的Multipart解析器/处理程序中的问题。我最近发表了一篇关于此相同问题的文章,并且由于找到了新信息,因此希望使用新信息重新发布。

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

请帮助我弄清楚这是怎么回事,以及是否有更好, 更简单的 解决方案来探索这些选项,但如果可以找到解决方案,我宁愿保留当前方法。

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


问题答案:

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

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

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

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

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

您可以在CommonsFileUpload文档中查看此文档。

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