Image 如何在Grails中显示图像?

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

我正在尝试使用以下代码呈现GSP页面中
/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请求你的图像吗

  • 不要将数据存储在WEB-INF中,将图像存储在/WEB app/images中/

  • 在控制器中:

    def baseFolder=servletContext.getRealPath(“/”)
    def folder=baseFolder+'/images//'/web应用程序/images/
    def imagesFolder=新文件(文件夹)
    def files=imagesFolder.listFiles().toList()
    列表图像列表=[]
    文件。每个{
    imageList.add(将其作为字符串)
    }
    返回图像列表
    
  • 3.你认为:

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