2008-11-03 10 views
9

Tôi vẫn đang học Grails và dường như đã gặp phải một trở ngại.Làm thế nào để hiển thị hình ảnh trong Grails GSP?

Dưới đây là các lớp học 2 miền:

class Photo { 
    byte[] file 

    static belongsTo = Profile 
} 


class Profile { 
    String fullName 
    Set photos 

    static hasMany = [photos:Photo]  
} 

Đoạn điều khiển liên quan:

class PhotoController { 

..... 
    def viewImage = { 

     def photo = Photo.get(params.id) 
     byte[] image = photo.file 
     response.outputStream << image 

    } 
...... 
} 

Cuối cùng đoạn GSP:

<img class="Photo" src="${createLink(controller:'photo', action:'viewImage', id:'profileInstance.photos.get(1).id')}" /> 

Bây giờ tôi làm cách nào để truy cập ảnh để nó được hiển thị trên GSP? Tôi chắc chắn rằng tiểu sửInstance.photos.get (1) .id không chính xác. Cảm ơn!!

+0

Bạn đã thử cái này chưa? Nó sẽ gây ra 'viewImage' để được gọi với id = 1, tham chiếu đến một cá thể Photo giả sử có một 'profileInstance' trong phạm vi.Bạn có thể cần phải điều chỉnh loại nội dung phản hồi Bạn có hỏi cách chọn _which_ ảnh được hiển thị không? –

+0

Tôi hy vọng sẽ hiển thị hình ảnh đầu tiên trong bộ này, cảm ơn. – Walter

Trả lời

3

Vì nó là một Set, nếu bạn muốn phần tử đầu tiên, bạn sẽ phải đi:

profileInstance.photos.toArray()[0].id 

hoặc

profileInstance.photos.iterator().next() 
+0

Có,/photo/viewImage/{anyPhotoId} hiển thị ảnh chính xác. Trên thực tế tôi nghĩ rằng tôi đã sử dụng một Set thay vì ArrayList. Đây có phải là cuase của vấn đề? Cảm ơn! – Walter

+0

@Walter - À vâng. Tôi đã sửa đổi câu trả lời của mình. –

0

tôi đoán là bạn cần phải thiết lập các kiểu nội dung của luồng phản hồi. Một cái gì đó như:

response.ContentType = "image/jpeg" 

Điều này có thể hoặc không cần trước khi bạn phát trực tiếp đến luồng phản hồi (không thể tưởng tượng được điều đó là quan trọng). Tôi chỉ cần đặt nó trước dòng outputStream trong mã của bạn ở trên.

+0

Tôi đã thử nghiệm điều này và dường như không yêu cầu cài đặt nhập nội dung. Tks. – Walter

2

bây giờ, tôi thực sự cho rằng việc lưu trữ ảnh dưới dạng nhị phân trong cơ sở dữ liệu không phải là giải pháp tốt nhất - mặc dù bạn có thể có lý do tại sao cần phải thực hiện theo cách đó.

cách lưu trữ tên của ảnh (và/hoặc đường dẫn) thay thế? Nếu các vấn đề xung đột tên có thể xảy ra, hãy sử dụng md5 checksum của ảnh làm tên. Sau đó, ảnh trở thành tài nguyên tĩnh, một tệp đơn giản, thay vì yêu cầu MVC phức tạp và chậm hơn.

+0

Đây có thể là một lựa chọn. Tôi sẽ cần phải khám phá thêm. Cảm ơn! – Walter

+1

Điều gì về việc bảo vệ hình ảnh đó? Nếu bạn đang sử dụng URL trực tiếp vào tệp, bạn sẽ mất khả năng (hoặc làm cho nó khó khăn hơn nhiều) để bảo vệ hình ảnh cho người dùng/vai trò cụ thể. – billjamesdev

+0

@bill: tôi đoán nó phụ thuộc vào yêu cầu. An ninh sẽ có chi phí, và phương pháp của tôi khó hơn một chút để bảo mật (không phải là không thể, nhưng nó có thể đơn giản hơn khi sử dụng các đề xuất của người khác nếu bảo mật là quan trọng). – Chii

4

Nếu bạn có một địa chỉ cho các hình ảnh, bạn chỉ cần phải chắc chắn rằng bạn trả lại Anser thích hợp trong bộ điều khiển:

def viewImage= { 
    //retrieve photo code here 
    response.setHeader("Content-disposition", "attachment; filename=${photo.name}") 
    response.contentType = photo.fileType //'image/jpeg' will do too 
    response.outputStream << photo.file //'myphoto.jpg' will do too 
    response.outputStream.flush() 
    return; 
    } 
0

id: 'profileInstance.photos.get (1) .id' nên id: profileInstance.photos.get (1) .id. không có hạn ngạch

1

Tôi cũng đang tìm hiểu về một ví dụ như thế này. Đoạn mã GSP không hoạt động đối với tôi. Tôi giải quyết bằng cách thay thế các dấu nháy đơn xung quanh profileInstance.photos.get (1) .id

<img class="Photo" src="${createLink(controller:'photo', action:'viewImage', id:'profileInstance.photos.get(1).id')}" /> 

với dấu ngoặc kép:

<img class="Photo" src="${createLink(controller:'photo', action:'viewImage', id:"profileInstance.photos.get(1).id")}" /> 

Bây giờ Grails giải quyết các biểu hiện xung quanh dấu ngoặc kép. Nếu không, nó sẽ lấy nó làm chuỗi.