2011-12-08 34 views
5

Tôi đang cố gắng tải hình ảnh từ cơ sở dữ liệu PostgreSQL vào jaspersoft ireports (4.0) nhưng tôi gặp lỗi.Hiển thị hình ảnh trong Ireports bằng cách sử dụng PostgreSql

Trong hình ảnh PostgreSQL được lưu trữ dưới dạng đối tượng bytea. Trong ireports, tôi đã thay đổi thuộc tính của trường hình ảnh thành java.io.InputStream.

Sau khi đặt hình ảnh trong báo cáo thuộc tính sau đã được thiết lập: lớp

Biểu hiện: java.io.InputStream biểu Ảnh: image field

Tôi cũng đã cố gắng this hướng dẫn để hiển thị hình ảnh blob trong iReport.

lỗi sau được hiển thị:

Error filling print... Image read failed. 
Setting up the file resolver...  
net.sf.jasperreports.engine.JRException: Image read failed.  
    at net.sf.jasperreports.engine.util.JRJdk14ImageReader.readImage(JRJdk14ImageReader.java:73)  
    at net.sf.jasperreports.engine.util.JRImageLoader.loadImage(JRImageLoader.java:245)  
    at net.sf.jasperreports.engine.JRImageRenderer.getImage(JRImageRenderer.java:476)  
    at net.sf.jasperreports.engine.JRImageRenderer.getDimension(JRImageRenderer.java:512)  
    at net.sf.jasperreports.engine.fill.JRFillImage.fitImage(JRFillImage.java:1251)  
    at net.sf.jasperreports.engine.fill.JRFillImage.prepare(JRFillImage.java:1173)  
    at net.sf.jasperreports.engine.fill.JRFillElementContainer.prepareElements(JRFillElementContainer.java:329)  
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:419)  
    at net.sf.jasperreports.engine.fill.JRFillBand.fill(JRFillBand.java:378)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2038)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:760)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:270)  
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:128)  
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:946)  
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:845)  
    at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:58)  
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:417)  
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:247)  
    at com.jaspersoft.ireport.designer.compiler.IReportCompiler.run(IReportCompiler.java:877)  
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:572)  
    at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:997)  
Print not filled. Try to use an EmptyDataSource... 
+0

Bạn có thể đăng mã và mẫu báo cáo không? –

+0

Tôi đang sử dụng phiên bản ireports chuyên nghiệp Tôi đã tạo một bảng trong postgres với các cột sau log -ouble lat -ouble image-bytea Template - mẫu A4 trống Sau đó, sau khi đặt phần tử báo cáo hình ảnh từ bảng màu vào báo cáo cấu hình biểu thức hình ảnh và biểu thức lớp (java.io.InputStream) Sau khi chạy thông báo lỗi báo cáo được hiển thị "Lỗi hiển thị trang báo cáo.Xem bảng điều khiển để biết chi tiết '.các lỗi tôi đã đăng ở trên trong câu hỏi. Nhưng khi tôi xóa phần tử hình ảnh khỏi báo cáo hoạt động tốt – 3502

+0

Có thể –

Trả lời

2

Trong PostgreSQL loại bytea không phải là một BLOB, và bạn không thể sử dụng một dòng suối. Trong các thuật ngữ chuẩn SQL, nó là một chuỗi byte. Nó sẽ được nạp vào một mảng byte trong Java.

Nếu bạn muốn sử dụng các kỹ thuật BLOB trong PostgreSQL, bạn phải sử dụng các đối tượng lớn lớn.

http://www.postgresql.org/docs/current/interactive/largeobjects.html

1

Hiển thị hình ảnh từ blob (postgresql) để hình ảnh trong iReport

Trong PostgreSQL hình ảnh được lưu giữ như blob-oid
Mã bên ReportController

  1. lấy đó chuỗi oid từ cơ sở dữ liệu chuyển đổi nó thành byte
  2. chuyển đổi giá trị mảng byte trong InputStream giá trị
  3. bản đồ nó vào tham số sẽ được sử dụng bên trong iReport
  4. mất một yếu tố hình ảnh thay đổi loại của nó để java.io.InputStream
  5. Tạo một thông số loại java.io.InputStream (sử dụng tên giống như lập bản đồ bên ReportController)
  6. Bây giờ xây dựng dự án và chạy
2

trải qua gần một ngày, cuối cùng tìm thấy các giải pháp;

  1. trong truy vấn sql select convert(your_image,'base64') as img from yourtable
  2. bộ biểu hiện hình ảnh lớp để java.io.InputStream
  3. trong biểu hình ảnh net.sf.jasperreports.engine.util.JRImageLoader.getInstance(new SimpleJasperReportsContext()).loadAwtImageFromBytes(javax.xml.bind.DatatypeConverter.parseBase64Binary($F{img}))

EDIT:

phiên bản

My PostgreSQL là: 9.4,

Nhờ FiruzzZ, ông đã tuyên bố rằng trong postgresql 9.1 thay vì hàm chuyển đổi, mã hóa (bytea, 'base64') có sẵn.

+0

chuyển đổi (bytea, string) không hoạt động, chức năng chưa được biết cho Postgres 9.1. Tôi đã sử dụng mã hóa (bytea, 'base64') và làm việc – FiruzzZ

+0

Cảm ơn bạn đã bình luận của bạn. – ismail

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