2012-04-13 3 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

+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

+0

@Raviあなたの返信をありがとう。私はenctypeを "multipart/form-data"に設定しました。私はこれを実際に試みる前にあなたが提供した例を調べました。しかしシナリオは異なります。この例では、イメージはデータベースに永続化されません。 – pippo

答えて

0

この問題をしばらく試してみると、提出するファイルの種類に依存するのではなく、ファイルのサイズに依存するようです。しきい値を超えた場合は、前述の問題が発生します。

私はこの問題に取り組むことができませんので、私はbyte[]CommonsMultipartFileからフィールドの型を変換し、このlinkによって示唆されているように私のコントローラでinitBinderメソッドを追加しようとしました。

これは機能します。

関連する問題