Исключение приведения класса в Groovy
-
16-09-2019 - |
Вопрос
Я хочу загрузить изображение с помощью groovy на grails.Моя страница gsp выглядит следующим образом (я показываю упрощенную версию оригинала)
<g:form controller="post" action="save" enctype="multipart/form-data">
My picture <input type="file" name="myPicture" />
<g:submitButton name="submit" value="Save"/>
</g:form>
Мой доменный класс выглядит следующим образом:
class Post {
byte[] myPicture
static mapping = {
myPicture type: "blob"
}
Мне нужно это сопоставление, иначе MySQL создаст smallblob, который слишком мал, чтобы соответствовать изображениям
static constraints = {
myPicture(nullable:false)
}
}
На контроллере у меня есть действие под названием save, которое выглядит следующим образом:
def save = {
def post = loadPost(params.id)
post.properties = params
if(post.save()) {
print "hallo world"
redirect(action:'list', params:params)
} else {
render(view:'edit', model:[post:post])
}
}
Исключение возникает, когда я пытаюсь сохранить изображение в базе данных.
2009-04-27 18:16:07,319 [20806951@qtp0-0] ERROR errors.GrailsExceptionResolver - java.lang.ClassCastException: [B cannot be cast to java.sql.Blob
org.codehaus.groovy.runtime.Исключение InvokerInvocationException:java.lang.ClassCastException:[B не может быть преобразован в java.sql.Blob
Какой-нибудь намек на то, почему это происходит?
Кстати, я видел в учебнике, что изображения обрабатывались как строки, но это тоже не сработало .
Решение
попробуйте этот способ:
def save = {
def post = loadPost(params.id)
def f = request.getFile('myPicture')
post.myPicture = f.getBytes()
post.pictureType = f.getContentType()
if(post.save()) {
Другие советы
Я нашел похожий вопрос на Nabble:
http://www.nabble.com/MySQL-and-Blobs-td16116885.html
Предлагаются два возможных решения:
- Измените ограничения свойства blob на большой максимальный размер, чтобы запретить ему использовать "TinyBlob".
- Используйте реализацию Hibernate Blob вместо byte[] для объявления типа свойства.Это потребует от вас потоковой передачи данных в большой двоичный объект вместо прямого назначения, но в сообщении выше приведен код для этого.
Можете ли вы попробовать использовать Spring's Многокомпонентный файл в пределах вашего loadPost()
способ?
Вот пример из Документы:
def upload = {
def f = request.getFile('myFile')
if(!f.empty) {
f.transferTo( new File('/some/local/dir/myfile.txt') )
response.sendError(200,'Done');
}
else {
flash.message = 'file cannot be empty'
render(view:'uploadForm')
}
}
Я верю, что вы можете получить доступ f.bytes
напрямую.