2013-02-17 43 views
5

Vấn đề này là với cơ sở dữ liệu oracle 10g. Cùng một mã đang làm việc tốt với cơ sở dữ liệu MySQL.Lỗi khi cố gắng hiển thị hình ảnh (đối tượng blob) trong jsp (Spring và Hibernate với Cơ sở dữ liệu Oracle)

My Mẫu Lớp

package com.killerlinks.model; 

    import java.io.Serializable; 
    import java.sql.Blob; 

    import javax.persistence.Column; 
    import javax.persistence.Entity; 
    import javax.persistence.GeneratedValue; 
    import javax.persistence.GenerationType; 
    import javax.persistence.Id; 
    import javax.persistence.Lob; 
    import javax.persistence.Table; 

    @Entity 
    @Table(name="links") 
    public class Linkform implements Serializable 
    { 
     /** 
     * 
     */ 
     private static final long serialVersionUID = 1L; 
     @Id 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     @Column(name="id") 
     private Long id; 
     @Column(name="tittle") 
     private String tittle; 
     @Column(name="xdesc") 
     private String desc; 
     @Column(name="url") 
     private String url; 
     @Column(name="category") 
     private String category; 
     @Column(name="xdate") 
     private String date; 
     @Column(name="xtime") 
     private String time; 
     @Column(name="tags") 
     private String tags; 

     @Column(name="image") 
     @Lob 
     private Blob fileData; 

     public Long getId() { 
      return id; 
     } 
     public void setId(Long id) { 
      this.id = id; 
     } 
     public String getTittle() { 
      return tittle; 
     } 
     public void setTittle(String tittle) { 
      this.tittle = tittle; 
     } 
     public String getDesc() { 
      return desc; 
     } 
     public void setDesc(String desc) { 
      this.desc = desc; 
     } 
     public String getUrl() { 
      return url; 
     } 
     public void setUrl(String url) { 
      this.url = url; 
     } 
     public String getCategory() { 
      return category; 
     } 
     public void setCategory(String category) { 
      this.category = category; 
     } 
     public String getDate() { 
      return date; 
     } 
     public void setDate(String date) { 
      this.date = date; 
     } 
     public String getTime() { 
      return time; 
     } 
     public void setTime(String time) { 
      this.time = time; 
     } 
     public String getTags() { 
      return tags; 
     } 
     public void setTags(String tags) { 
      this.tags = tags; 
     } 

     @Override 
     public String toString() 
     { 
      return "Linkform [tittle=" + tittle + ", url=" + url + ", category="+ category +", tags="+ tags +", desc="+ desc +", fileData="+fileData+" ]"; 
     } 
     public Blob getFileData() { 
      return fileData; 
     } 
     public void setFileData(Blob fileData) { 
      this.fileData = fileData; 
     } 
    } 

Phương pháp này từ lớp điều khiển của tôi mà giúp giữ đối tượng blob đến lớp mô hình.

private Linkform preparingModelBean(LinkformBean linkformbean, MultipartFile file) 
    { 
     Linkform linkform = new Linkform(); 
     linkform.setTittle(linkformbean.getTittle()); 
     linkform.setUrl(linkformbean.getUrl()); 
     linkform.setCategory(linkformbean.getCategory()); 
     linkform.setDesc(linkformbean.getDesc()); 
     linkform.setTags(linkformbean.getTags()); 


     Date date = new Date(); 
     SimpleDateFormat sdate = new SimpleDateFormat("yyyy.MM.dd"); 
     SimpleDateFormat stime = new SimpleDateFormat("HH:mm"); 


     linkform.setDate(sdate.format(date)); 
     linkform.setTime(stime.format(date)); 

     try { 
      Blob blob = Hibernate.createBlob(file.getInputStream()); 

      linkform.setFileData(blob); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 


     return linkform; 
    } 

Đây là một phương pháp từ lớp điều khiển, nơi mà tôi đang cố gắng để đọc đối tượng blob

@RequestMapping(value ="/image/{id}") 
    public String image(@PathVariable("id")Long id, HttpServletResponse response) 
    { 
     Linkform linkform = linkformservice.getALink(id); 

     try { 
      response.setHeader("Content-Disposition", "inline;filename=\"" +linkform.getTittle()+ "\""); 
      OutputStream out = response.getOutputStream(); 
      response.setContentType("image/jpeg"); 
      IOUtils.copy(linkform.getFileData().getBinaryStream(), out); 
      out.flush(); 
      out.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

khi tôi đang cố gắng để gọi hình ảnh cụ thể này là đầu ra tôi đang được nhận

error message i am gettting

Khi tôi kích hoạt url từ trình duyệt http://localhost:7070/KillerLinks/image/381.htm

đây là lỗi được hiển thị trong bảng điều khiển của tôi

java.sql.SQLException: Closed Connection 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 
    at oracle.sql.BLOB.getDBAccess(BLOB.java:955) 
    at oracle.sql.BLOB.getBinaryStream(BLOB.java:229) 
    at org.hibernate.lob.SerializableBlob.getBinaryStream(SerializableBlob.java:39) 
    at com.killerlinks.controllers.CategoryController.image(CategoryController.java:63) 
    at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) 
    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:647) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:123) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:171) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931) 
    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:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    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:619) 
java.sql.SQLException: Closed Connection 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146) 
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208) 
    at oracle.sql.BLOB.getDBAccess(BLOB.java:955) 
    at oracle.sql.BLOB.getBinaryStream(BLOB.java:229) 
    at org.hibernate.lob.SerializableBlob.getBinaryStream(SerializableBlob.java:39) 
    at com.killerlinks.controllers.CategoryController.image(CategoryController.java:77) 
    at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710) 
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) 
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) 
    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:647) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.__invoke(StandardContextValve.java:123) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.__invoke(StandardHostValve.java:171) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:931) 
    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:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    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:619) 
Hibernate: select linkform0_.id as id1_0_, linkform0_.category as category1_0_, linkform0_.xdate as xdate1_0_, linkform0_.xdesc as xdesc1_0_, linkform0_.image as image1_0_, linkform0_.tags as tags1_0_, linkform0_.xtime as xtime1_0_, linkform0_.tittle as tittle1_0_, linkform0_.url as url1_0_, linkform0_.xviews as xviews1_0_ from links linkform0_ where linkform0_.id=? 

Vui lòng giúp tôi khắc phục lỗi. Tôi muốn hình ảnh được hiển thị. Cảm ơn trước.

+0

Thay đổi @Lob thành @ Blob – Kris

+0

@kris @ Blob không khả dụng. tôi có nên thêm bất kỳ lọ nào cho nó không. – SKR

+0

Chỉ một phút. Tôi sẽ trở lại, không thay đổi thành @Blob – Kris

Trả lời

1

Tôi nghĩ rằng điều khiển của bạn sẽ trông như thế này:

@RequestMapping(value ="/image/{id}") 
    public void image(@PathVariable("id")Long id, HttpServletResponse response) 
    { 
     Linkform linkform = linkformservice.getALink(id); 

     try { 
      response.setContentType("application/x-download"); 
      response.setHeader("Content-Disposition", "attachment; filename=" + filename); 

      OutputStream out = response.getOutputStream(); 
      response.setContentType("image/jpeg"); 
      IOUtils.copy(linkform.getFileData().getBinaryStream(), out); 
      out.flush(); 
      out.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 

Nó sẽ gửi tập tin của bạn để tải về trực tiếp.

Bên cạnh đó bạn có thể thêm tập tin hình ảnh để html trang

<img src="/image/5"></img> 
+0

mã mà bạn đã cho didnot hoạt động. Khi tôi sử dụng mã đó, nó đang tải hình ảnh với 0 byte. – SKR

1

Hãy thử điều này

@RequestMapping(value ="/image/{id}") 
public void image(@PathVariable("id")Long id, HttpServletResponse response) 
{ 
    Linkform linkform = linkformservice.getALink(id); 
    InputStream image = null; 
    image = linkform.getFileData().getBinaryStream(); 

    try { 
     OutputStream out = response.getOutputStream(); 
     response.setContentType("image/jpeg"); 

     int length = (int) image.available(); 
     int bufferSize = 1024; 
     byte[] buffer = new byte[bufferSize]; 
     while ((length = image.read(buffer)) != -1) { 
      out.write(buffer, 0, length); 
     } 
      response.flushBuffer(); 
     //image.close(); 
     out.flush(); 
     out.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

} 
+0

Tôi đã thử mã của bạn, nhưng nhận được trang trống. Không có đầu ra, thậm chí không lỗi (Chỉ cần trang trống). – SKR

+0

nếu bạn không muốn tải xuống xóa mã này - response.setHeader ("Nội dung-Bố cục", "nội tuyến; tên tệp = \" "+ linkform.getTittle() +" \ ""); Xem câu trả lời được cập nhật, tôi đang sử dụng một mã tương tự để hiển thị hình ảnh trong jsp – Kris

+0

tôi đã xóa dòng đó nhưng vẫn giống nhau. Không có đầu ra, thậm chí không lỗi (Chỉ cần trang trống). – SKR

1

Có bất kỳ đoạn mã khác gọi linkform.getFileData()? Nếu không, bạn có nhớ sửa đổi mã của bạn một chút như sau. Entity Class:

@Column(name="image") 
@Lob 
private Byte[] fileData; 

public Byte[] getFileData() { 
    return fileData; 
} 
public void setFileData(Byte[] fileData) { 
    this.fileData = fileData; 
} 

Và cũng thay đổi điều khiển của bạn dựa trên mới getFileData().

Tôi không thể đảm bảo rằng giải pháp này chắc chắn sẽ giải quyết được bảng câu hỏi của bạn, nhưng đáng để bạn sử dụng nó. Lý do tôi nói như vậy là dấu vết ngoại lệ cho bạn biết mã không thành công khi mở một kết nối DB để tải dữ liệu Blob. Và theo tài liệu java, giao diện Blob thực sự là một con trỏ logic đến SQL Blob cơ bản thay vì giữ dữ liệu thực. Vì bộ điều khiển hết phiên làm việc ngủ đông, nó có thể không mở được kết nối khác với DB để lấy giá trị Blob.

Các vấn đề liên quan