Grails in Action 中给出了上传文件的方法,但好像有点问题,改过的如下所示:
1. 上传够保存到数据库的方式
默认情况下,grails的 byte[] 在mysql中使用的是tinyblob,所以当上传大文件的时候就出现错误。
最简单的办法:
直接手动把数据库该字段的类型从tinyblob改成longblob,但是注意DataSouce中的dbCreate方式要改成“update”
development {
dataSource {
dbCreate = "update" // one of 'create', 'create-drop','update'
//url = "jdbc:hsqldb:mem:devDB"
driverClassName = "com.mysql.jdbc.Driver"
username = "root"
password = "dens"
url = "jdbc:mysql://localhost:3306/hubbub?useUnicode=true&characterEncoding=utf8"
}
}
2. 上传后保存到文件的方式
服务器端: ImageController中的action 为rawUpload, 主要是增加了获取
rootPath以及params.id,然后保存.
def rawUpload = {
def mhsr = request.getFile('photo')
def rootPath = this.servletContext.getRealPath("")
if(!mhsr?.empty && mhsr.size < 1024*20000) {
mhsr.transferTo(
new File("$rootPath/images/upload/${params.userId}/mugshot.gif") )
}
}
客户端: 主要是增加了请求格式
enctype="multipart/form-data"
1 <html>
2 <head>
3 <title>Upload Image</title>
4 <meta name="layout" content="main"/>
5 </head>
6 <body>
7
8 <g:uploadForm action="rawUpload" enctype="multipart/form-data">
9 User Id:
10 <g:select name="userId" from="${com.grailsinaction.User.list()}"
11 optionKey="userId" optionValue="userId" />
12 <p/>
13 Photo: <input name="photo" type="file" />
14 <g:submitButton name="upload" value="Upload"/>
15 </g:uploadForm>
16 </body>
17 </html>