GSP, изображение из массива байта - PullRequest
0 голосов
/ 27 марта 2011

У меня есть класс JDO и вспомогательный класс Image для хранения изображений в байтовом массиве

Класс JDO:

@PersistenceCapable
class Recipe{

    @PrimaryKey
        @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
        private Long key

        @Persistent
        private String description

        @Persistent(serialized = "true")
        private Image image;
}

Класс изображения:

class Image implements Serializable {

    private byte[] content
    private String filename
    private String mimeType
}

На странице gsp я перебираю рецепты и хочу показать изображения. Я мог бы сделать такой контроллер, чтобы получить изображение src.

 def viewImage= {
    //retrieve photo code here
    response.setHeader("Content-disposition", "attachment; filename=${photo.name}")
    response.contentType = photo.fileType //'image/jpeg' will do too
    response.outputStream << photo.file //'myphoto.jpg' will do too
    response.outputStream.flush()
    return;
  }

Но так я должен отправить ключ рецепта этому контроллеру и снова загрузить изображение из хранилища данных. (Я уже загрузил его на самом деле. Но я думаю, что я не могу отправить эти данные в контроллер. Могу ли я?) Нет ли более удобного способа показать изображение из байтового массива на странице gsp?

1 Ответ

1 голос
/ 27 марта 2011

У меня здесь похожий вариант использования, класс File domain, содержащий байт [] и метаинформацию для загруженных файлов.Для загрузки файла я использую:

def fileDownload = {
    long id = params.id as long
    def file = File.get(id)
    assert file
    def fileName = URLEncoder.encode(file.name)
    response.addHeader("content-disposition", "attachment;filename=$fileName")
    response.contentType = file.contentType
    response.contentLength = file.data.size()
    response.outputStream << file.data
}

Что касается перезагрузки файла снова и снова, мне было бы все равно, кеширование Hibernate 2-го уровня заботится об этом.Если у вас все еще есть веская причина не загружать файл в запросе на загрузку, вы можете сохранить его в сеансе http во время предыдущего вызова.Недостаток хранения этого в сеансе http:

  • в случае множества одновременных сеансов, высокое потребление памяти
  • вы увидите странные исключения из Hibernate (будьте уверены в этом!)
  • все, что хранится в сеансе http, должно быть сериализуемым
...