简体   繁体   中英

Unable to retrieve image from oracle database using spring mvc and hibernate

I am developing an application wherein I am storing a user profile into Database, which has a blob object to be saved. I am through with the saving part but now I am stuck with the retrieval part.

I am using Spring MVC and Hibernate in my application and below is my code snippet

HTML:

<img src="${pageContext.request.contextPath}/profilemanager/image.action?username=<%=username%>" class="avatar img-circle" alt="Avatar">

Model File:

@Entity
@Table(name="TMP_BLOB")
public class UserDetails {

    private String username;
    private String email;
    private String password;
    private CommonsMultipartFile avatar;


    public UserDetails() {
        super();
        // TODO Auto-generated constructor stub
    }



    public UserDetails(String username, String email, String password,
            CommonsMultipartFile avatar) {
        super();
        this.username = username;
        this.email = email;
        this.password = password;
        this.avatar = avatar;
    }



    @Id
    @Column(name="USERNAME")
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Column(name="EMAIL_ID")
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column(name="PASSWORD")
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Column(name="AVATAR")
    @Lob
    public CommonsMultipartFile getAvatar() {
        return avatar;
    }

    public void setAvatar(CommonsMultipartFile avatar) {
        this.avatar = avatar;
    }

}

Controller File :

@Controller
public class ProfileManagerController {

    private ProfileManagerService profileManagerServices;

    @RequestMapping(value="/profilemanager/image.action", method=RequestMethod.GET)
    public void showUserImage(@RequestParam("username") String username, HttpServletResponse response, HttpServletRequest request) throws IOException {


        List<UserDetails> userAvatar = profileManagerServices.getUserImage(username);
        response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
        response.setHeader("Content-Length", String.valueOf(userAvatar.get(0).getAvatar().getBytes().length));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + userAvatar.get(0).getAvatar().getName() + "\"");
        response.getOutputStream().write(userAvatar.get(0).getAvatar().getBytes());
        response.getOutputStream().close();
    }


    /**
     * DEPENDENCY INJECTION
     * @param profileManagerServices
     */


    @Autowired
    public void setProfileManagerServices(
            ProfileManagerService profileManagerServices) {
        this.profileManagerServices = profileManagerServices;
    }


}

Service File:

@Service
public class ProfileManagerService {

    ProfileManagerDAO profileManagerDAO;

    public List<UserDetails> getUserImage(String username) {
        // TODO Auto-generated method stub
        return profileManagerDAO.getUserAvatar(username);
    }

    @Autowired
    public void setProfileManagerDAO(ProfileManagerDAO profileManagerDAO) {
        this.profileManagerDAO = profileManagerDAO;
    }

}

DAO File:

@Repository
public class ProfileManagerDAO implements IProfileManager {

    private HibernateTemplate hibernateTemplate;

    /**
     * @param sessionFactory
     */

    @Autowired
    public void setSessionFactory(SessionFactory sessionFactory) {
        hibernateTemplate = new HibernateTemplate(sessionFactory);
    }

    /**
     * @param username
     * @return
     */

    @SuppressWarnings("unchecked")
    public List<UserDetails> getUserAvatar(String username) {
        DetachedCriteria criteria = DetachedCriteria.forClass(UserDetails.class);

        criteria.add(Restrictions.or(Restrictions.eq("username", username),Restrictions.eq("email", username)));

        return hibernateTemplate.findByCriteria(criteria);
    }

}

And now when the service is fired from img:src attribute it gives the following stack trace in DAO file having code return hibernateTemplate.findByCriteria(criteria);

SEVERE: Servlet.service() for servlet [blob-crud-mvc] in context with path [/Spring-BLOB-CRUD] threw exception [Request processing failed; nested exception is org.springframework.orm.hibernate3.HibernateSystemException: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize] with root cause
java.io.FileNotFoundException: D:\spring-tool-suite-3.6.0.RELEASE-e4.4-win32\spring-tool-suite-3.6.0.RELEASE-e4.4-win32\sts-bundle\vfabric-tc-server-developer-2.9.6.RELEASE\base-instance\work\Catalina\localhost\Spring-BLOB-CRUD\upload_71270b64_14d1e55f083__7ff0_00000004.tmp (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:146)
    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:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370)
    at org.hibernate.util.SerializationHelper.doDeserialize(SerializationHelper.java:244)
    at org.hibernate.util.SerializationHelper.deserialize(SerializationHelper.java:306)
    at org.hibernate.type.SerializableToBlobType.fromBytes(SerializableToBlobType.java:91)
    at org.hibernate.type.SerializableToBlobType.get(SerializableToBlobType.java:83)
    at org.hibernate.type.AbstractLobType.nullSafeGet(AbstractLobType.java:68)
    at org.hibernate.type.AbstractType.hydrate(AbstractType.java:105)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2267)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1423)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1351)
    at org.hibernate.loader.Loader.getRow(Loader.java:1251)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:619)
    at org.hibernate.loader.Loader.doQuery(Loader.java:745)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2294)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
    at org.hibernate.loader.Loader.list(Loader.java:2167)
    at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
    at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
    at org.springframework.orm.hibernate3.HibernateTemplate$36.doInHibernate(HibernateTemplate.java:1056)
    at org.springframework.orm.hibernate3.HibernateTemplate$36.doInHibernate(HibernateTemplate.java:1)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1046)
    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1039)
    at com.datamatics.profilemanager.dao.ProfileManagerDAO.getUserAvatar(ProfileManagerDAO.java:70)
    at com.datamatics.profilemanager.service.ProfileManagerService.getUserImage(ProfileManagerService.java:40)
    at com.datamatics.profilemanager.service.ProfileManagerService$$FastClassByCGLIB$$e652b46c.invoke(<generated>)
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)
    at com.datamatics.profilemanager.service.ProfileManagerService$$EnhancerByCGLIB$$c558fc33.getUserImage(<generated>)
    at com.datamatics.profilemanager.web.ProfileManagerController.showUserImage(ProfileManagerController.java:86)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:174)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:421)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:409)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

Any help is appreciated, thanks in advance.

You are saving a CommonsMultipartFile in database but you need save it in a blob field

first declare your image field

@Lob
private byte[] avatar;

@Transient //we don't need to map a database this field
private CommonsMultipartFile avatarMPF;

when the user POST the image save with:

byte[] bytes = userAvatar.get(0).getAvatarMPF().getBytes();
               userAvatar.get(0).setAvatar(bytes);

the getUserImage method doesn't change:

response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
...
response.getOutputStream().write(userAvatar.get(0).getAvatar().getBytes());
response.getOutputStream().close();

Hope be useful.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM