创建项目,然后在build.gradle中引入:
compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.3' compile group: 'commons-io', name: 'commons-io', version: '2.5'
创建一个名为FileResource的域类(domain),用来保存文件信息
package com.system /** * 文件资源 */ class FileResource { //文件编号 String uuid //原文件名 String oldName //新文件名 String newName //相对路径 String relPath //绝对路径 String absolutePath FileResource(String oldName, String newName, String relPath, String absolutePath) { this.uuid = UUID.randomUUID().toString() this.oldName = oldName this.newName = newName this.relPath = relPath this.absolutePath = absolutePath } static constraints = { uuid unique: true } static mapping = { version false } def beforeInsert() { uuid = UUID.randomUUID().toString() } }
创建UploadController类
package com.system import grails.converters.JSON import grails.transaction.Transactional class UploadController { def index() { } @Transactional def upload() { def info = [result:false,msg: "文件上传失败!"] try { def file = request.getFile("file") //原文件名 String oldName = file.getOriginalFilename() //用时间戳作为新文件名 String newName = System.currentTimeMillis()+oldName.substring(oldName.lastIndexOf(".",oldName.length()-1)) //文件保存相对路径 String path = "/upload" //文件保存绝对路径 String dirPath = request.getSession().getServletContext().getRealPath(path) File saveFile = new File(dirPath) if(!saveFile.exists()){ saveFile.mkdirs() } if(file){ //上传文件 file.transferTo(new File(dirPath + File.separator + newName)) //文件上传成功后,文件信息录入文件信息表 FileResource fr = new FileResource(oldName,newName,path,dirPath) fr.save(failOnError:true,flash:true) info.result = true info.msg = "文件上传成功!" } } catch (e) { log.error("文件上传失败,errorMsg={}",e) } //返回json render info as JSON } }
我这里文件上传插件用的layui2.0的,请到layui官网:http://www.layui.com/ 自行下载,也可以用其他上传插件 下载后,复制里面的layui到grails-app/assets/javascripts下面,目录结构如下:
├─grails-app │ ├─assets │ │ ├─images │ │ │ └─skin │ │ ├─javascripts │ │ │ └─layui │ │ │ ├─css │ │ │ │ └─modules │ │ │ │ ├─laydate │ │ │ │ │ └─default │ │ │ │ └─layer │ │ │ │ └─default │ │ │ ├─font │ │ │ ├─images │ │ │ │ └─face │ │ │ └─lay │ │ │ └─modules │ │ └─stylesheets
在grails-app/views下面创建upload/index.gsp,页面内容:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>upload模块快速使用</title> <asset:stylesheet href="layui/css/layui.css"/> </head> <body> <button type="button" class="layui-btn" id="fileUpload"> <i class="layui-icon"></i>上传图片 </button> <asset:javascript src="layui/layui.js"/> <script> layui.use(['upload', 'layer'], function(){ var upload = layui.upload; var layer = layui.layer; //执行实例 var uploadInst = upload.render({ elem: '#fileUpload' //绑定元素 ,url: '${createLink(controller: "upload", action: "upload")}' //上传接口 ,done: function(res){ //上传完毕回调 layer.msg(res.msg); } ,error: function(){ //请求异常回调 } }); }); </script> </body> </html>
在grails-app/conf/application.yml最后面配置grails文件上传限制大小(200M):
--- grails: controllers: upload: maxFileSize: 2000000 maxRequestSize: 2000000
到此配置已经ok,启动项目,访问:http://localhost:8080/upload/index 进行测试
注意事项:
1、如果不配置文件上传大小限制,默认限制大小为128kb,超过就会报错 2、页面引入js和css方式最好用: <asset:stylesheet href="xxx.css"/> <asset:stylesheet src="xxx.js"/> 且一般css放head里面,js放</body>前面
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!