Отображение изображения в GSP (Grails), получить ссылку из базы данных - PullRequest
3 голосов
/ 22 ноября 2010

Я новичок в Grails.Я пытаюсь показать эскиз изображения для каждого продукта на сайте, например:

<a href="#"><img src="${resource(dir:"images", file: "Nikon.jpg") }"/></a>/* 1 */

Проблема здесь в том, что я хочу сохранить ссылку на изображение в базе данных ,и получить ссылку по:

${fieldValue(bean: productInstance, field: "image")}  /* 2 */

Но я не могу заменить код / ​​* 2 / на места "Nikon.jpg" в / 1 * /, это вызываетсинтаксическая ошибка!

После некоторых исследований я вижу, что в большинстве уроков показано, как отображать изображения, которые хранятся непосредственно в базе данных (например, Как отображать изображения в Grails GSP? ).Я не уверен, что этот подход лучше, но я все еще хочу взять ссылку на изображение из базы данных.

Я также попытался найти библиотеку тегов grails, чтобы найти какой-либо тег поддержки, но безуспешно.Кто-нибудь может дать мне подсказку?

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010

Правильный синтаксис, чтобы избежать синтаксических ошибок, был бы:

<img src="${resource(dir:'images', file:fieldValue(bean:productInstance, field:'image'))}" />

Но я рекомендую вам написать свой собственный tagLib, потому что написать его очень просто, и ваши GSP будут выглядеть намного лучше, если вы будете часто использовать этот код. Вы можете легко написать тег, который будет называться что-то вроде: <product:image product='productInstance' /> и для дополнительного удобства вы можете сделать так, чтобы tagLib выводил ссылку.

Простота написания tagLibs - действительно, на мой взгляд, одна из лучших функций grails.

0 голосов
/ 12 февраля 2018

Мне нужно было защищенное решение, которое было сделано в комбинации http://grails.asia/grails-example-application-simple-document-management-system и http://grails.asia/grails-render-images-on-the-fly-in-gsp. Для этой цели я использовал домен, где я храню путь к изображениям, gsp для отображения изображений и контроллер для обслуживания изображений

Домен:

class Document {
String filename
String fullPath
Date uploadDate = new Date()
static constraints = {
    filename(blank:false,nullable:false)
    fullPath(blank:false,nullable:false)
}

}

Страница сервера Grails:

<!DOCTYPE html>
<html>
    <head>
        <meta name="layout" content="main">
        <title>Document List</title>
    </head>
<body>

        <div class="content scaffold-list" role="main">
            <h1>Document List</h1>
        <g:if test="${flash.message}"><div class="message" role="status">${flash.message}</div></g:if>
            <table>
                <thead>
                    <tr>
                    <g:sortableColumn property="filename" title="Filename" />
                    <g:sortableColumn property="uploadDate" title="Upload Date" />
                    <g:sortableColumn property="Preview" title="Vista Previa" />
                </tr>
            </thead>
            <tbody>
                <g:each in="${documentInstanceList}" status="i" var="documentInstance">
                    <tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
                        <td><g:link action="download" id="${documentInstance.id}">${documentInstance.filename}</g:link></td>
                        <td><g:formatDate date="${documentInstance.uploadDate}" /></td>
                        <td><g:img style="height:120px;width:120px;" uri="/doclist/images?id=${documentInstance.id}"  /></td>
                    </tr>
                </g:each>
            </tbody>
        </table>

        <div class="pagination">
            <g:paginate total="${documentInstanceTotal}" />
        </div>
    </div>
</body>
</html>

Контроллер:

import org.springframework.security.access.annotation.Secured
class DoclistController {

@Secured(['ROLE_ADMIN'])      
def list(){

    params.max = 10
    [documentInstanceList: Document.list(params), documentInstanceTotal: Document.count()]

    //render view: 'list'
}

@Secured(['ROLE_ADMIN'])      
def images(long id){
    Document documentInstance = Document.get(id)
    if ( documentInstance == null) {
        flash.message = "Document not found."
        redirect (action:'list')
    } else {

        def file = new File(documentInstance.fullPath)
        def fileInputStream = new FileInputStream(file)
        def outputStream = response.getOutputStream()
        byte[] buffer = new byte[4096];
        int len;
        while ((len = fileInputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.flush()
        outputStream.close()
        fileInputStream.close()
    }
}
}

Я показываю изображения базы данных следующим образом

DoclistController Result

Надеюсь, это поможет

0 голосов
/ 23 декабря 2013

Я сохраняю образ storagePath в базе данных как расширение ../../../web- app/personImages/imageName.img, используя FileUploadService.Для отображения изображений в GSP

<img style="height:120px;width:102px;"src="${resource(dir:'personImages',file:domainInstance.id + '.png')}" />

Пример

Первое использование FileUploadSevices file

Домен:

class PersonalDetails {

String avatar

static constraints = {

    avatar(nullable:true,maxSize: 1024000)

}

Действие контроллера save ():

// Save Avatar if uploaded
def avatarImage = request.getFile('avatar')
    if (!avatarImage.isEmpty()) {
    personalDetailsInstance.avatar = fileUploadService.uploadFile(avatarImage, 
       "${personalDetailsInstance.id}.png", "personImages")
        }

Путь к хранилищу файлов БД:

В файле аватара:

C:\Documents and Settings\Administrator\Documents\workspace-ggts-3.4.0.RELEASE\IDiary\web-app\personImages/1.png

Список GSP:

<img style="height: 120px;width: 102px;"src="${resource(dir:'personImages', file: personalDetailsInstance.id + '.png')}" />
0 голосов
/ 22 ноября 2010

Подождите секунду ... Если я прочитал ваш вопрос буквально, вы пытаетесь что-то вроде этого:

<a href="#"><img src="${resource(dir:"images", 
        file: "${fieldValue(bean: productInstance, field: "image")} ") }"/></a>

Ну, это запутанно и неправильно. Это должно работать:

<a href="#"><img src="${fieldValue(bean: productInstance, field: "image")}"/></a>
...