2012-04-13 2 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). 누락 된 항목이있는 경우. 또 다른 유용한 [link] (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 방법을 추가했습니다.

작동합니다.