Image 如何在Grails中显示图像?
我正在尝试使用以下代码呈现GSP页面中Image 如何在Grails中显示图像?,image,grails,gsp,Image,Grails,Gsp,我正在尝试使用以下代码呈现GSP页面中/WEB-INF/images/sps中的图像: def index = { def baseFolder = grailsAttributes.getApplicationContext().getResource("/").getFile().toString() println baseFolder def imagesFolder = baseFolder + '/images/sps' println imagesF
/WEB-INF/images/sps
中的图像:
def index = {
def baseFolder = grailsAttributes.getApplicationContext().getResource("/").getFile().toString()
println baseFolder
def imagesFolder = baseFolder + '/images/sps'
println imagesFolder
def imageList1 = new File(imagesFolder).list()
println imageList1
def imageList = Arrays.asList(imageList1)
println imageList
imageList
//redirect(action:"displayImages", params:["imageList":imageList])
//render(view:"displayImages")
}
控制器能够从文件系统读取映像。但是,当我尝试使用以下代码显示它们时,图像不会出现
index.gsp
<g:each in="${imageList}" var="image">
<img src="${resource(dir: 'images', file: image.filename)}" alt="Grails"/>
</g:each>
并且没有为循环代码(index.gsp代码上方)生成HTML代码。它只是一片空白
我的要求是显示文件系统文件夹中的所有图像文件。您将返回一个文件对象列表,其中您将调用文件对象的toString方法,该方法很可能返回文件对象的绝对文件路径。
这将在html源代码中提供类似的内容
你有没有试过把它转换成一个列表,用g:each来表示
为什么要将图像存储在WEB-INF/images中?为什么不仅仅是图像?我认为代码
${resource(dir:'images')}
会指向后者。您不能使用标准图像标记呈现位于WEB-INF下的图像。这些图像无法通过web访问。您需要另一个控制器将图像流回到视图中。比如说:
class AvatarController {
def show = {
def userInstance = User.get(params.id)
def avatarFilePath = new File(userInstance.avatarURL)
response.setContentType("application/png")
response.setContentLength(avatarFilePath.size().toInteger())
OutputStream out = response.getOutputStream();
out.write(avatarFilePath.bytes);
out.close();
}
}
然后显示此图像:
<img src="/app/avatar/1234" />
我会让你把它转换成你自己的需要。然而,关键是您必须将图像流回,因为它在当前位置无法通过web访问
不过,您最好在WEB-INF之外为它们提供服务。这更简单。您应该将动作中的模型作为映射返回:
[imageList:imageList]
,以便在GSP中按名称提供imageList
是的,你能将图像
文件夹移动到web app
-全世界都可以通过HTTP请求你的图像吗
def baseFolder=servletContext.getRealPath(“/”)
def folder=baseFolder+'/images//'/web应用程序/images/
def imagesFolder=新文件(文件夹)
def files=imagesFolder.listFiles().toList()
列表图像列表=[]
文件。每个{
imageList.add(将其作为字符串)
}
返回图像列表
<g:each in="${imageList}" var="image">
<img src="${resource(dir: 'images', file: image)}" alt="Grails"/>
</g:each>
实际上,File.list()
返回String[]
.I秒-您得到的HTML是什么?您生成的URL中是否有任何文件?@Victor未生成任何代码。它只是一片空白。我怀疑它根本不是在迭代。看起来@netbrain是对的,您需要将数组转换为列表-如果println imageList
给出了一些合理的结果。@Victor:还是不走运。我已经编辑了我的问题。对不起,这是错误的-确实有效,有时甚至
也有效。如果不能访问WEB-INF,它有什么意义呢?不,你错了。WEB-INF目录是WEB应用程序的私有区域,不能通过指定URL等直接从浏览器访问WEB-INF目录下的任何文件。Web容器将不提供此目录的内容。但是,应用程序中的类可以访问WEB-INF目录的内容。所以,如果您不希望直接从web浏览器访问任何资源,如JSP或HTML文档,则应将其放在web-INF目录下。发自:哦,我的错-我一直在读“webapp
”而不是“webinf
”。你能编辑你的答案吗?这样我就可以删除否决票了?无论如何,最好将图像
文件夹放入web app
中,并将其作为文件使用,而不是通过应用程序代码进行传输。
def imageList = Arrays.asList(new File(imagesFolder).list())
class AvatarController {
def show = {
def userInstance = User.get(params.id)
def avatarFilePath = new File(userInstance.avatarURL)
response.setContentType("application/png")
response.setContentLength(avatarFilePath.size().toInteger())
OutputStream out = response.getOutputStream();
out.write(avatarFilePath.bytes);
out.close();
}
}
<img src="/app/avatar/1234" />
def baseFolder = servletContext.getRealPath("/")
def folder = baseFolder + '/images/' // web-app/images/
def imagesFolder = new File(folder)
def files = imagesFolder.listFiles().toList()
List<String> imageList = []
files.each {
imageList.add(it as String)
}
return imageList
<g:each in="${imageList}" var="image">
<img src="${resource(dir: 'images', file: image)}" alt="Grails"/>
</g:each>