2010-12-29 76 views
18

Tôi đang thực sự làm việc trên một trang web dựa trên GWT. Bây giờ tôi bị mắc kẹt về cách tôi nên hiển thị hình ảnh được lưu trữ trong một cơ sở dữ liệu trên trang web của tôi.GWT - hình ảnh từ cơ sở dữ liệu

Về cơ bản tôi đã tìm thấy một cơ sở dữ liệu trong cơ sở dữ liệu của mình, mà tôi tìm nạp bằng cách sử dụng chế độ ngủ đông. Bây giờ tôi nên có lẽ tạo ra một ... thẻ ra khỏi dữ liệu đó, nhưng tôi không biết làm thế nào

Tôi đang sử dụng GWT trong Java và Hibernate

+7

+1 .. bởi vì mọi nhà phát triển gwt sẽ gặp phải vấn đề này. –

Trả lời

11

Đây là giải pháp. Trước tiên, bạn nên mã hóa mảng byte bằng cách sử dụng com.google.gwt.user.server.Base64Utils.toBase64 (byte []). Nhưng phương pháp này không hoạt động cho IE 7. và IE8 có giới hạn 32kb .. IE9 không có giới hạn này.

đây là phương pháp trên máy chủ

public String getImageData(){ 
     String base64 = Base64Utils.toBase64(imageByteArray); 
     base64 = "data:image/png;base64,"+base64; 
     return base64; 
} 

Dưới đây là phương pháp của khách hàng;

@Override 
public void onSuccess(String imageData) {  
    Image image = new Image(imageData);  
    RootPanel.get("image").add(image); 
} 
+0

Tôi đã thử điều đó.Cảm ơn – Hons

+0

"hình ảnh" có nghĩa là gì (thẻ đó là gì) trong cuộc gọi này RootPanel.get ("hình ảnh"); và làm thế nào để làm tương tự trong uibinders và hành động gửi. – Bennet

+0

@Bennet 'image' ở đây là id của thẻ div được tạo trong trang html của dự án gwt. –

1

Image Widget trong GWT. Bạn không thể làm điều đó phía máy khách nhưng bạn có thể gọi RPC để giao tiếp với máy chủ. Sau đó, nó là ứng dụng CRUD đơn giản. Trong máy chủ kết nối với cơ sở dữ liệu với hibernate và trả lại hình ảnh cho khách hàng hoặc url của nó và trên phía máy khách làm một cái gì đó như thế:

@Override 
public void onSuccess(String imageUrl) { 
    Image image = new Image(imageUrl); 
    RootPanel.get("image").add(image); 
} 

@Override 
public void onFailure(Throwable caught) { 
    Window.alert(caught.getMessage()); 
} 

Đó là tất cả. Mã hóa hạnh phúc

+0

Được rồi, tôi biết về tiện ích đó, nhưng nó đòi hỏi một URL, mà tôi không có, vì nó là một hình ảnh trong một DB – Hons

+0

bạn nên lấy nó và lưu nó vào đĩa (getBLOB) sau đó cung cấp url của nó cho hình ảnh . Nếu không, tôi nghĩ bạn không thể hiển thị hình ảnh tôi muốn nói mà không phải đối phó với đĩa –

+0

> Tôi nghĩ bạn không thể hiển thị hình ảnh mà tôi muốn nói mà không phải đối phó với đĩa đó - Có bạn có thể hiển thị hình ảnh mà không cần sao chép nó đĩa. Tất cả những gì bạn cần làm là trả lại blob về giao diện người dùng. – ch4nd4n

4

Tôi không biết GWT hoạt động như thế nào, mặc dù bạn có thể ánh xạ một servlet/bộ điều khiển trả về resourceStream. Ví dụ, nếu bạn ánh xạ một servlet "ImageViewer" mà mất ImageID param, yêu cầu hình ảnh sẽ trở nên

/imageViewer?imageId=1234 

Hibernate đối tượng sẽ phải tham chiếu đến blob, vì vậy bạn có thể trở lại đó. tham khảo trên giao diện người dùng sẽ

<img src="/imageViewer?imageId=1234"/> 

Cập nhật: Bạn không có thể sử dụng mẫu vì nó là để trở về hình ảnh, bạn sẽ cần một bộ điều khiển rõ ràng hay servlet mà trả về dữ liệu dòng.
Trong servlet bạn sẽ làm điều gì đó như

// get reference to input stream 
InputStream in = hibnerateObject.getImage(); 
// set MIME type etc 
response.setContentType(mimeType); 
OutputStream out = response.getOutputStream(); 
while ((len = in.read(buf)) >= 0) 
out.write(buf, 0, len); 
in.close(); 
out.close(); 
+0

Điều đó có vẻ khá hợp lý. Trong một "bình thường" JSP hoặc PHP hoặc bất cứ trang chủ nào bạn cũng phải làm một cái gì đó như thế này. Hoặc là? – Hons

+0

Bạn có thể yêu cầu từ "trình duyệt", bất kể công nghệ xem/tạo khuôn mẫu. Một yêu cầu HTTP đơn giản của nó. Nó cũng làm việc với Ajax. – ch4nd4n

+0

Hướng dẫn tuyệt vời về việc cung cấp hình ảnh thông qua các servlets: http://balusc.blogspot.com/2007/04/imageservlet.html Cách tiếp cận này cũng hoạt động với tiện ích Hình ảnh –

1

tôi đã sử dụng phương pháp tương tự như Gursel Koca gợi ý nhưng chỉ có thể có được nó để làm việc bằng cách sử dụng thư viện Apache Base64, không (trớ trêu thay) các Base64Utils GWT

String base64 = Base64.encodeBase64String(array); 
base64 = "data:image/"+type+";base64," + base64; 
return base64; 

Cũng lưu ý rằng nếu bạn đang cập nhật hình ảnh hiện có hoặc trình giữ chỗ hình ảnh, phương pháp setURL sẽ ghi đè biểu định kiểu của bạn, vì vậy hãy đảm bảo lấy mẫu đầu tiên:

String styleName = profilePicture.getStyleName(); 
profilePicture.setUrl(base64String); 
profilePicture.setStyleName(styleName); 
Các vấn đề liên quan