2015-03-19 4 views
0

Я пишу приложение grails (v2.4.4) для хранения информации о песнях в музыкальной библиотеке. Одним из «атрибутов» песни является «ключ». Поэтому я хочу написать таблицу проверки/поиска (класс домена), которая будет содержать все допустимые ключи. Поскольку не все, кто делает ввод данных, автоматически узнают, что персонал с 1 Flat - это масштаб F/май. Я хочу включить изображение персонала в качестве сравнения.Grails 2.4.4 Отобразить файл изображения, который был сохранен в MySQL

(Я не могу вставить изображение персонала , недостаточно «точек», вы можете увидеть пример персонала в wikepedia, если вы заинтересованы. http://en.wikipedia.org/wiki/F_major)

Я могу получить этот файл, хранящийся в таблице MySQL, в виде BLOB-грайла, это прекрасно. Но я не могу для жизни меня (используя многие из примеров, которые я нашел), чтобы заставить изображение «показать». Все, что я вижу в «Действительном списке ключей», это строка «байты». может кто-нибудь указать мне в правильном направлении, пожалуйста.

ValidKeys Домен Класс:

package musicdb 

class ValidKeys { 

    String musicalKey 
    String aka 
    byte[] staffImg 

    static constraints = { 
     musicalKey (unique: true, nullable: false) 
     aka (nullable: true) 
     staffImg (nullable: true, maxSize: (1024*1024)) 
    } 
} 

ValidKeysControler: (стандарт "генерируется" контроллер)

package musicdb 

import static org.springframework.http.HttpStatus.* 
import grails.transaction.Transactional 

@Transactional(readOnly = true) 
class ValidKeysController { 

    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 

    def index(Integer max) { 
     params.max = Math.min(max ?: 10, 100) 
     respond ValidKeys.list(params), model:[validKeysInstanceCount: ValidKeys.count()] 
    } 

    def show(ValidKeys validKeysInstance) { 
     respond validKeysInstance 
    } 

    def create() { 
     respond new ValidKeys(params) 
    } 

    @Transactional 
    def save(ValidKeys validKeysInstance) { 
     if (validKeysInstance == null) { 
      notFound() 
      return 
     } 

     if (validKeysInstance.hasErrors()) { 
      respond validKeysInstance.errors, view:'create' 
      return 
     } 

     validKeysInstance.save flush:true 

     request.withFormat { 
      form multipartForm { 
       flash.message = message(code: 'default.created.message', args: [message(code: 'validKeys.label', default: 'ValidKeys'), validKeysInstance.id]) 
       redirect validKeysInstance 
      } 
      '*' { respond validKeysInstance, [status: CREATED] } 
     } 
    } 

    def edit(ValidKeys validKeysInstance) { 
     respond validKeysInstance 
    } 

    @Transactional 
    def update(ValidKeys validKeysInstance) { 
     if (validKeysInstance == null) { 
      notFound() 
      return 
     } 

     if (validKeysInstance.hasErrors()) { 
      respond validKeysInstance.errors, view:'edit' 
      return 
     } 

     validKeysInstance.save flush:true 

     request.withFormat { 
      form multipartForm { 
       flash.message = message(code: 'default.updated.message', args: [message(code: 'ValidKeys.label', default: 'ValidKeys'), validKeysInstance.id]) 
       redirect validKeysInstance 
      } 
      '*'{ respond validKeysInstance, [status: OK] } 
     } 
    } 

    @Transactional 
    def delete(ValidKeys validKeysInstance) { 

     if (validKeysInstance == null) { 
      notFound() 
      return 
     } 

     validKeysInstance.delete flush:true 

     request.withFormat { 
      form multipartForm { 
       flash.message = message(code: 'default.deleted.message', args: [message(code: 'ValidKeys.label', default: 'ValidKeys'), validKeysInstance.id]) 
       redirect action:"index", method:"GET" 
      } 
      '*'{ render status: NO_CONTENT } 
     } 
    } 

    protected void notFound() { 
     request.withFormat { 
      form multipartForm { 
       flash.message = message(code: 'default.not.found.message', args: [message(code: 'validKeys.label', default: 'ValidKeys'), params.id]) 
       redirect action: "index", method: "GET" 
      } 
      '*'{ render status: NOT_FOUND } 
     } 
    } 
} 
+0

Я предполагаю, что я должен показать, как я пытался сделать это случиться. В контроллере я добавил следующий код: \t \t Защиту displayStaffImage() { \t \t \t DEF validKeyInstance = File.get (params.id) \t \t \t response.outputStream << validKeyInstance.staffImg \t \t \t response.outputStream.flush() \t \t – mlhart58

+0

} Пробовал оба из них: \t <г: createLink контроллер = "ValidKeys" Action = "displayStaffImage" ID = "$ {validKeysInstance .id}?" /> и/или G тег не работает, сохранен в записи из базы данных – mlhart58

ответ

0

Спасибо Крис.

Я на самом деле просто получил эту работу в «show.gsp». Мне не нужно было добавлять «contentType», чтобы он работал, но я думаю, что вернусь и добавлю это поле домена и соответствующий код, поскольку большинство примеров, которые я нашел, похоже, включают его.

Что я сделал, чтобы сделать его работу является:

  1. в контроллера «Защиту displayStaffImage()
    • изменил File.get (params.id) в ValidKeys.findById (Params. id)
  2. В "показать.GSP "используется тег
    • <span class="property-value" aria-labelledby="staffImg-label"><img src="${createLink(controller:'ValidKeys', action:'displayStaffImage', id:"${validKeysInstance.id}") }" width='100'/></span>
    • BTW,„оболочка“часть клонировали из других„полей“из„генерировать“шаг. Это на самом деле не нужно, но я решил попробовать быть последовательным.

Однако ... То же не работают в «index.gsp». Id не нравится «идентификатор» как пары здесь. Я попробую еще несколько идей и пост, если у меня будет успех. Но если у кого-нибудь есть указатели на то, чтобы получить фактическое изображение в «index.gsp», я был бы благодарен за него.

Еще раз спасибо Крис!

+0

Упс! Он работает намного лучше без опечаток! Так что теперь я работаю в index.gsp, используя тот же тег без окружающего "" mlhart58

0

Вы почти там. В методе displayStaffImage(), который вы упомянули в своем комментарии, вам также необходимо включить тип MIME изображения в качестве типа содержимого.

Например:

def displayStaffImage() { 
    def validKeyInstance = File.get(params.id) 
    response.setContentType("image/png") 
    response.outputStream << validKeyInstance.staffImg 
    response.outputStream.flush() 
} 

Смотрите принятый ответ от Grails: displaying created image in gsp для другого примера.

Если вы не знаете или не хранить тип MIME, по какой-либо причине, вы можете использовать тип содержимый «приложение/октет-поток» (означающий двоичный файл) и указать имя файла вместо:

def displayStaffImage() { 
    def validKeyInstance = File.get(params.id) 
    response.setContentType("application/octet-stream") 
    response.setHeader("Content-disposition", "attachment;filename=\"${validKeyInstance.fileName}\"") 
    response.outputStream << validKeyInstance.staffImg 
    response.outputStream.flush() 
} 

Редактировать: Я отмечаю, что вы фактически не храните имя файла в своем ключевом описании, поэтому, возможно, мое второе предложение не так важно, но оно по-прежнему является жизнеспособным вариантом, если у вас есть эта информация.

0

это со мной работал у меня есть этот тип столбца в области

class User implements Serializable { 
    Blob userPic 
} 

и я получаю результат

def obj = User.findById(userId) 
     def img= obj.userPic 
     out << '<img src="data:image/png;base64,' 
     out<< img.binaryStream.bytes.encodeBase64() 
     out<< '">' 
Смежные вопросы