题
我要上载图像用一个时髦的上杯.我的普惠制网页是如下(我表示一个简化版本的原)
<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)
}
}
在控制我们的行动称为保存如下:
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.常规。运行时间。InvokerInvocationException:java。郎。ClassCastException:[B不能被抛到爪哇。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".
- 使用的休眠Blob执行情况,而不是字节[]财产的类型宣言》。这将要求您的流数据进Blob,而不是直接分配,但是该职位上给代码这样做。
您可以尝试使用Spring的的 MultipartFile您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
。
不隶属于 StackOverflow