//1.controller package com.xdth class UploadController { def index() { render(view:"../index") } /** * 文件上传 * @return */ def upload(){ /*定义文件上传基本目录*/ def path = "/upload" def basePath = request.getSession().getServletContext().getRealPath(path) //检查upload是否存在 File saveFile = new File(basePath) if(!saveFile.exists()){ saveFile.mkdirs() } def description = params["description"] def file = request.getFile("myFile") //上传文件原文件名 def oldName = file.getOriginalFilename() if(file){ //用时间戳作为新文件名 def newName = System.currentTimeMillis()+oldName.substring(oldName.lastIndexOf(".",oldName.length()-1)) //上传文件开始 file.transferTo(new File(basePath+File.separator+newName)) Upload upload = new Upload(oldName,newName,basePath,description) upload.save() } flash.message = "${oldName} 上传成功!" //从一个action跳转到另一个action redirect action:"show",model: [params:params] } /** * 文件下载 * @return */ def download(){ def upload = Upload.findById(params.id) //File.separator根据当前系统自动获取盘符 def downloadPath = upload.filePath+File.separator+upload.newName def file_name = upload.newName def bis = new BufferedInputStream(new FileInputStream(downloadPath)) def bos = new BufferedOutputStream(response.outputStream) long fileLength = new File(downloadPath).length() response.setCharacterEncoding("UTF-8") response.setContentType("multipart/form-data") String userAgent = request.getHeader("User-Agent").toLowerCase() if (userAgent.contains("msie") || userAgent.contains("like gecko")) { // win10 ie edge 浏览器 和其他系统的ie file_name = URLEncoder.encode(file_name, "UTF-8") } else { file_name = new String(file_name.getBytes("UTF-8"), "iso-8859-1") } response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", file_name)) response.setHeader("Content-Length", String.valueOf(fileLength)) byte[] buff = new byte[2048] int bytesRead while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead) } bis.close() bos.close() } /** * 全部文件查看 * @return */ def show(){ def max = Math.min(params.max ? params.max.toInteger() : 10, 100) def offset = params.offset ? params.offset.toInteger() : 0 def queryList = Upload.executeQuery("from Upload",[max:max,offset:offset]).asList() respond queryList,view: "show",model: [queryList:queryList,params:params,count:queryList.size()] } }
2.index.gsp
<body> <div> <g:form controller="upload" action="upload" method="post" enctype="multipart/form-data"> <table> <tr> <td><input type="file" name="myFile"></td> <td>文件描述:<textarea maxlength="50" name="description"></textarea></td> </tr> <tr> <td colspan="2"><button type="submit">上传文件</button></td> </tr> </table> </g:form> </div> <div> <g:link controller="upload" action="show">查看全部文件</g:link> </div> </body>
3.show.gsp
<body> <div class="nav" role="navigation"> ${flash.message} </div> <div class="nav"> <g:form action="show"> <table> <tr> <g:sortableColumn property="id" action="show" title="id" params="${params}"/> <g:sortableColumn property="oldName" action="show" title="原文件名" params="${params}"/> <g:sortableColumn property="newName" action="show" title="现文件名" params="${params}"/> <g:sortableColumn property="description" action="show" title="文件描述" params="${params}"/> <td>操作</td> </tr> <g:each in="${queryList}" var="it"> <tr> <td>${it.id}</td> <td>${it.oldName}</td> <td>${it.newName}</td> <td>${it.description}</td> <td><g:link action="download" id="${it.id}">下载</g:link></td> </tr> </g:each> </table> </g:form> </div> <div class="panel-footer"> <div class="pagination"> <!--分页标签默认显示10条--> 共${count?:0}条 <g:paginate total="${count?:0}" params="${params}"/> </div> </div> <br/> <g:link controller="upload" action="index">返回</g:link> </body>
相关推荐
grails中的上传,下载,需要的请下载
Grails入门指南书籍和源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺 getting started with grails chinese Grails入门指南书籍和源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺 getting started with ...
NULL 博文链接:https://rox.iteye.com/blog/834595
NULL 博文链接:https://extrimlycold20070206121610.iteye.com/blog/1139647
7.10 处理文件上传 7.10.1 使用multipart请求 7.10.2 上传和数据绑定 7.11 本章小结 第8章 groovycservercpages 8.1 基础知识 8.1.1 理解模型 8.1.2 页面指令 8.1.3 ...
自己买的书,然后用扫描机扫描的,整个文件太大了,不能一次性上传上来,所以拆成3个part。 我自己学grails很想看这本书,结果网上没有,就自己去买了,然后共享给需要的人。 如果有什么问题请联系我下架。
自己买的书,然后用扫描机扫描的,整个文件太大了,不能一次性上传上来,所以拆成3个part。 我自己学grails很想看这本书,结果网上没有,就自己去买了,然后共享给需要的人。 如果有什么问题请联系我下架。
6.1.8 上传文件 6.1.9 命令对象 6.2 Groovy Server Pages 6.2.1 GSP基础 6.2.1.1 变量和作用域 6.2.1.2 逻辑和迭代 6.2.1.3 页面指令 6.2.1.4 表达式 6.2.2 GSP标签 6.2.2.1 变量和作用域 6.2.2.2 逻辑和迭代 6.2....
8.2 文件上传的实现 107 8.2.1 开发表单页面 107 8.2.2 在Controller中接收文件 108 8.3 修改订单状态 109 8.4 本章小结 110 第9章 Grails的自动化测试 111 9.1 Grails自动化测试基础知识 111 9.2 编写测试用例 113...
自己买的书,然后用扫描机扫描的,整个文件太大了,不能一次性上传上来,所以拆成3个part。 我自己学grails很想看这本书,结果网上没有,就自己去买了,然后共享给需要的人。 如果有什么问题请联系我下架。
适用于Grails的DropBox插件 这是Grails的插件,旨在使用此插件从Grails应用程序内部...允许分块上传文件并跟踪其部分。 允许删除文件。 允许将文件从一个文件夹移动到另一个文件夹。 以及Dropbox提供的所有其他功能。
将示例数据源和电子邮件配置文件复制到您机器上的某个位置,并使用您的配置更新它们。 您需要更新将它们复制到 。 cp grails-app/conf/DataSource.example.groovy /etc/grails/config/lochchat/DataSource.groovy ...
特征CKEditor版本4.x( ) Rails 5.x,4.2.x集成文件浏览器HTML5文件上传器用于formtastic和simple_form表单生成器的钩子与授权框架和集成安装对于基本用法,只需包含ckeditor gem: gem 'ckeditor'或者,如果您想...
Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及build.xml文档模板 inverse和cascade在关联更新中的作用 hibernate ...
在这种情况下,可以上传文件,“同意管理系统”会将每页另存为单独的同意书,操作员将分别对每页进行批注。 支持多个同意书模板 在ORB中,使用了多种同意书,例如一般同意书,成人肿瘤学同意书和……。 在这种情况...
网络词典系统。 通过上传更多XDXF格式的词典文件可扩展。 写在Grails。 使用Compass-Lucene作为搜索引擎。 RESTful搜索。 兼容Tomcat,Jetty,Weblogic ...
最坏的范式一个用于收集内存实验数据的网络应用程序部署该Web应用程序是一个标准的Grails项目。 克隆这个仓库在项目上进行grails war 在您的服务器上安装 将位于/target的 war 文件上传到您的 tomcat 实例