как отображать изображения в Grails? - PullRequest
0 голосов
/ 27 апреля 2011

Я пытаюсь отобразить изображения из /WEB-INF/images/sps на странице GSP, используя следующий код:

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>

Какую ошибку я делаю?

РЕДАКТИРОВАТЬ :

Когда я пытаюсь использовать одно изображение, оно работает нормально - я могу просмотреть изображение, находящееся в папке WEB-INF/images

<img src="${resource(dir: 'images', file: '1.jpg')}" alt="Grails"/>

И нет HTML-кода, который генерируется для кода цикла (над кодом index.gsp).Его просто пусто.

Мое требование - отобразить все файлы изображений, которые находятся в папке файловой системы.

Ответы [ 4 ]

1 голос
/ 28 апреля 2011

Это было проще.Вы должны вернуть модель из действия в виде карты: [imageList: imageList] для imageList, которая будет доступна по имени в GSP.

И да, вы можете переместить папку images в web-app - этоХорошо, что весь мир может запрашивать ваши изображения через HTTP?

0 голосов
/ 29 апреля 2011
  1. не храните данные в WEB-INF, храните ваши изображения в / web-app / images /

  2. в вашем контроллере:

    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
    

3 по вашему мнению:

   <g:each in="${imageList}" var="image">
       <img src="${resource(dir: 'images', file: image)}" alt="Grails"/>
    </g:each>
0 голосов
/ 27 апреля 2011

Вы не можете рендерить изображения, расположенные в WEB-INF, используя стандартный тег изображения.Изображения не доступны в Интернете.Вам понадобится еще один контроллер, который будет передавать изображения обратно на просмотр.Итак, что-то вроде этого:

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

0 голосов
/ 27 апреля 2011

вы возвращаете список объектов File, где вы вызываете метод toString объекта file, который, скорее всего, возвращает абсолютный путь к файлу объекта file. это даст вам что-то вроде этого в HTML-коде

<img src="/app/images/c:\path\to\imagefile.png">

попробуйте позвонить

<img src="${resource(dir: 'images', file: image.name)}" alt="Grails"/>

и если это не сработает, покажите нам HTML-код, который он производит.


В свете новых знаний вышесказанное не сработает. Возвращение File.list () на самом деле является String [], где каждая строка - это имя файла, а не полный путь.

В любом случае, просмотр источника html пролил бы свет на то, что именно распечатывается.

Я подозреваю, что, возможно, g: каждый не поддерживает итерации по простым типам массивов, таким как String [], вы можете попробовать преобразовать его в List.

def imageList = Arrays.asList(new File(imagesFolder).list())

Вы пытались преобразовать его в список и использовать g: каждый с этим?

почему вы храните ваши изображения в WEB-INF / images? почему не только изображения? я думаю, что код ${resource(dir:'images')} будет указывать на последнее.

...