2012-04-13 63 views
1

我是Spring MVC和Hibernate的新手,並且一直在學習。使用Spring 3和Hibernate進行多文件上傳4

當我試圖將圖像上傳到網站並將其存儲在MySQL數據庫中時,我遇到了這個問題。

我有一個項目模型,它包含一個照片模型列表。在每個照片模型中,都有一個名爲照片的實際存儲照片的字段(CommonsMultipartFile)。

ProjectModel.java

public class ProjectModel{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL) 
    private List<PhotoModel> photos; 
    //getters and setters 
} 

PhotoModel.java

public class PhotoModel extends AbstractModel implements Serializable{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @Column(columnDefinition = "LONGBLOB") 
    private CommonsMultipartFile photo; 

    @ManyToOne(fetch = FetchType.LAZY) 
    private ProjectModel project; 
    //getters and setters 
} 

addProject.jsp

<form:input type="file" path="photos[0].photo"/> 
<form:input type="file" path="photos[1].photo"/> 

ProjectController.java

@RequestMapping(value="/project/add", method = {RequestMethod.GET}) 
public String toAddProject (Model model){ 
    if (!model.containsAttribute(Constants.COMMAND)){ 
     ProjectModel project = new ProjectModel(); 
     project.setPhotos(new AutoPopulatingList<PhotoModel>(PhotoModel.class)); 
     model.addAttribute(Constants.COMMAND, project); 
    } 
    return "/user/addProject"; 
} 

@RequestMapping(value="/project/add", method = {RequestMethod.POST}) 
public String addProject Model model, @ModelAttribute("command") @Valid ProjectModel command, BindingResult result){ 

    if(result.hasErrors()) { 
      model.addAttribute(Constants.COMMAND, command); 
      return toAddProject(model); 
     } 

    projectService.save(command); 
    return "redirect:/success"; 
} 

我的問題是,我能夠上傳某些類型的圖像,如jpg或jpeg,但不是PNG。如果我嘗試上傳這樣的文件,錯誤如下。

org.springframework.orm.hibernate4.HibernateSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize 
    at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:206) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:606) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:488) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    at $Proxy32.save(Unknown Source) 
    at cn.javass.demo.web.controller.ProjectController.addProject(ProjectController.java:64) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at cn.javass.common.web.filter.BackURLFilter.doFilter(BackURLFilter.java:37) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: org.hibernate.type.SerializationException: could not deserialize 
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:250) 
    at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:306) 
    at org.hibernate.internal.util.SerializationHelper.clone(SerializationHelper.java:95) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor$SerializableMutabilityPlan.deepCopyNotNull(SerializableTypeDescriptor.java:55) 
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor$SerializableMutabilityPlan.deepCopyNotNull(SerializableTypeDescriptor.java:42) 
    at org.hibernate.type.descriptor.java.MutableMutabilityPlan.deepCopy(MutableMutabilityPlan.java:57) 
    at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:340) 
    at org.hibernate.type.AbstractStandardBasicType.deepCopy(AbstractStandardBasicType.java:336) 
    at org.hibernate.type.TypeHelper.deepCopy(TypeHelper.java:67) 
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:135) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:325) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) 
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:480) 
    ... 53 more 
Caused by: java.io.FileNotFoundException: /Users/Paddy/Documents/apache-tomcat-7.0.25/work/Catalina/localhost/Spring3Hibernate4Chinese/upload_1bc5d431_136acd506da__8000_00000013.tmp (No such file or directory) 
    at java.io.FileInputStream.open(Native Method) 
    at java.io.FileInputStream.<init>(FileInputStream.java:120) 
    at org.apache.commons.fileupload.disk.DiskFileItem.readObject(DiskFileItem.java:709) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:969) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1848) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1946) 
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1870) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1752) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:244) 
    ... 72 more 

似乎找不到臨時文件。我不確定Spring或Hibernate在幕後發生了什麼。

真的希望有人能解決這個問題嗎?

謝謝。

+1

任何人都可以幫忙嗎?真的很感激它。 – pippo 2012-04-14 02:45:22

+0

您是否將表單enctype設置爲「mulitpart/form-data」並查看[documentation](http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/mvc) .html#mvc-multipart)如果你缺少任何東西。另一個有用的[鏈接](http://www.raistudies.com/spring/spring-mvc/file-upload-spring-mvc-annotation/) – Ravi 2012-04-14 21:52:39

+0

@Ravi感謝您的回覆。我確實將表單enctype設置爲「multipart/form-data」。我在實際嘗試這個之前看了你提供的例子。雖然情況不同。在該示例中,圖像不會保存到數據庫中。 – pippo 2012-04-14 22:04:10

回答

0

經過一段時間的試驗後,似乎它不依賴於我提交的文件的類型,而是依賴於文件的大小。如果超過閾值,則會出現所描述的問題。

因爲我不能夠解決這個問題,我想字段類型從CommonsMultipartFile轉換爲byte[],並在我的控制器添加initBinder方法,通過這種link的建議。

它的工作原理。

相關問題