我想在grails上使用groovy上传图像。 我的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])
}
}
当我尝试在DB上保存图像时抛出异常。
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
任何暗示为什么会这样?
顺便说一下,我在一个教程中看到过,图像是作为字符串处理的,但它没有用 同样。答案 0 :(得分:2)
我在Nabble上发现了一个类似的问题:
http://www.nabble.com/MySQL-and-Blobs-td16116885.html
建议采用两种可能的解决方案:
答案 1 :(得分:2)
您可以尝试在loadPost()
方法中使用Spring的MultipartFile吗?
以下是docs:
的示例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
。
答案 2 :(得分:1)
尝试这种方式:
def save = {
def post = loadPost(params.id)
def f = request.getFile('myPicture')
post.myPicture = f.getBytes()
post.pictureType = f.getContentType()
if(post.save()) {