代码之家  ›  专栏  ›  技术社区  ›  Hoàng Long

在GSP(Grails)中显示图像,从数据库获取链接

  •  3
  • Hoàng Long  · 技术社区  · 14 年前

    我是个菜鸟。我正在尝试为网站中的每个产品显示图像缩略图,如下所示:

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

    问题是我想 将图像链接保存到数据库中 ,并通过以下方式获取链接:

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

    但我不能替换/*2 /编码到“Nikon.jpg”的位置/ 1*/,它会导致语法错误!

    在做了一些研究之后,我发现大多数教程都展示了如何显示直接存储在数据库中的图像(例如, How to display image in grails GSP? ). 我不确定这种方法是否更好,但我仍然想从数据库中获取图像链接。

    我还试图搜索grails标记库以找到任何支持标记,但没有成功。有人能给我个提示吗?

    4 回复  |  直到 7 年前
        1
  •  3
  •   Gregor Petrin    14 年前

    避免语法错误的正确语法是:

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

    但我建议您编写自己的tagLib,因为编写tagLib非常简单,而且如果您经常使用这段代码,gsp看起来会更好。您可以很容易地编写一个标记,称为: <product:image product='productInstance' /> 对于额外的可用性,也可以让tagLib输出链接。

        2
  •  0
  •   Michael Borgwardt    14 年前

    等等。。。如果我逐字逐句地读你的问题,你在尝试这样的事情:

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

    好吧,那是复杂的和错误的。这应该有效:

    <a href="#"><img src="${fieldValue(bean: productInstance, field: "image")}"/></a>
    
        3
  •  0
  •   Justin Wood Yu Hao    11 年前

    我将映像存储路径保存在数据库中,就像 ../../../web- app/personImages/imageName.img 使用FileUploadService的扩展。 用于在GSP中显示图像

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

    例子

    首先使用fileuploadservices文件

    域:

    class PersonalDetails {
    
    String avatar
    
    static constraints = {
    
        avatar(nullable:true,maxSize: 1024000)
    
    }
    

    控制器保存()操作:

    // 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
    

    普惠制清单:

    <img style="height: 120px;width: 102px;"src="${resource(dir:'personImages', file: personalDetailsInstance.id + '.png')}" />
    
        4
  •  0
  •   Gelberth Amarillo Rojas    6 年前

    我需要一个安全的解决方案 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

    希望这有帮助