文件上传(Grails 1.2.1
)
《技术精解》里面对文件上传的代码非常简练。在GSP中将Pathurl写成type=file,在Controller的Action中根据request读取文件,将文件上传到服务器中,在将数据保存在数据库中,但是在运行时却发现应该做个别修正:
1)Action中文件写入服务器
原代码:
def f =
request.getFile("photoUrl") //获取文件
def fileName = f.originalFilename
//获取文件名
if(!f.empty){
f.transferTo(new File(servletContext.getRealPath("/file/")+fileName)) //将文件上传
}
更改代码:
def f = request.getFile("photoUrl")
def fileName = f.originalFilename
if(!f.empty){
f.transferTo(new
File(servletContext.getRealPath("/file/")+"\\"+fileName))
}
注:否则文件名会在原有名字前加了一个file字符串。
2)Action中数据绑定
原代码:
goods.properties
= params
goods.photoUrl
= createLinkTo(dir:”file”,file:filename)
更改代码:
goods.title = params.title //分别将params中的Goods对象的各个属性进行赋值(除Pathurl外)
…
goods.photoUrl = createLinkTo(dir:"file",file:fileName)//取出在浏览器上访问该文件的URL
注:在使用properties对数据进行绑定时会将Goods类的Pathurl的属性进行了改变,导致了在持久化前的校验失败。所以此处改为一个个的赋值。这个方法比较笨,希望有人能提供更好的方法实现数据绑定。
修改(2010-5-15):在最近的学习中发现,在绑定数据时可以使用以下方式赋值:
1)goods.properties["goodsname",'desc'] = params//此时将只绑定goodsname, desc这2个只定的参数,其他参数则不考虑
2)bindData
方法同样允许你排除某些你不想更新的参数
bindData(goods, params, [exclude:'photoUrl']) //除了指定的‘photoUrl’其他参数都参与绑定
bindData(goods, params, [include:['goodsname','desc]])//只绑定指定的这2个参数