我是Grails的新手。我正在尝试为网站中的每个产品显示图片缩略图,如下所示:
<a href="#"><img src="${resource(dir:"images", file: "Nikon.jpg") }"/></a>/* 1 */
这里的问题是我想保存数据库中的图像链接,并通过以下方式获取链接:
${fieldValue(bean: productInstance, field: "image")} /* 2 */
但是我无法将/ * 2 /代码替换为/ 1 * /中的“Nikon.jpg”的位置,会导致语法错误!
在做了一些研究之后,我发现大多数教程都展示了如何显示直接存储在数据库中的图像(例如,How to display image in grails GSP?)。我不确定这种方法是否更好,但我仍然希望从数据库中获取图像链接。
我还尝试搜索grails标记库以查找任何支持标记,但没有成功。谁能给我一个提示?
答案 0 :(得分:3)
避免语法错误的正确语法是:
<img src="${resource(dir:'images', file:fieldValue(bean:productInstance, field:'image'))}" />
但是我建议你编写自己的tagLib,因为编写一个非常简单,如果你要使用这个代码,你的GSP看起来会更好。您可以轻松编写一个类似于以下内容的标记:
<product:image product='productInstance' />
并且为了额外的可用性,您可以使tagLib也输出链接。
在我看来,编写tagLibs的简单性确实是最好的grails功能之一。
答案 1 :(得分:0)
等一下......如果我从字面上看你的问题,那你就是在尝试这样的事情:
<a href="#"><img src="${resource(dir:"images",
file: "${fieldValue(bean: productInstance, field: "image")} ") }"/></a>
嗯,那是错综复杂的。这应该有效:
<a href="#"><img src="${fieldValue(bean: productInstance, field: "image")}"/></a>
答案 2 :(得分:0)
我使用FileUploadService将图像storagePath保存在数据库中,如../../../web-
app/personImages/imageName.img
扩展名。
用于在GSP中显示图像
<img style="height:120px;width:102px;"src="${resource(dir:'personImages',file:domainInstance.id + '.png')}" />
实施例
首先使用FileUploadSevices文件
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')}" />
答案 3 :(得分:0)
我需要一个由http://grails.asia/grails-example-application-simple-document-management-system和http://grails.asia/grails-render-images-on-the-fly-in-gsp组合而成的安全解决方案。对于那个purpouse我使用了一个域,我存储图像的路径,一个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()
}
}
}
我按如下方式显示数据库的图像
希望这有帮助