//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中上传和下载操作的深入解析,包括其实现机制、代码示例及注意事项。 ### 文件上传 ...
在本文中,我们将深入探讨如何在Grails框架中结合uploadify插件实现文件上传功能。Grails是一款基于Groovy语言的、高效的Web应用开发框架,它简化了Java平台上的开发流程。uploadify则是一个JavaScript库,它允许...
本文档将带你深入理解Grails的核心概念、主要特性以及实践技巧。 1. **Groovy 语言基础** Groovy 是Java平台上的动态脚本语言,它与Java语法兼容,但更加简洁,支持闭包和元编程。在Grails中,Groovy用于编写控制...
Grails入门指南书籍和源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺 getting started with grails chinese Grails入门指南书籍和源码----下载不扣分,回帖加1分,欢迎下载,童叟无欺 getting started with ...
3. 扩展性:FCKEditor插件可以与其他Grails插件(如文件上传插件)配合使用,提供更强大的功能,如图片管理和多媒体资源管理。 4. 版本兼容:虽然grails-fckeditor-0.9.5是较旧的版本,但理解其工作原理有助于我们...
### Grails框架中文第二版...- 支持上传文件,简化了文件上传逻辑。 - 支持命令对象,用于封装复杂的表单数据。 - 支持处理重复的表单提交,防止恶意操作。 - 支持简单类型转换器,用于将字符串转换成特定的数据类型。
2. 安装配置:首先需要安装Java Development Kit(JDK),然后通过Grails官方下载页面获取最新版本的Grails,并将其添加到系统路径中。 3. 创建项目:使用`grails create-app`命令创建新项目,Grails会自动生成项目...
你可以修改模板文件,引入CSS库如Bootstrap来美化界面,或者利用jQuery插件增强交互性,例如文件上传、日期选择等。 3. **调整模板逻辑**:在Grails中,模板文件使用Groovy模板语言编写,允许直接嵌入Groovy代码。...
标题中的"grails-fck-editor-0.3.zip_grails_grails-fck-...对于使用Grails开发的Web应用,这个插件可以帮助实现用户友好的富文本编辑功能,同时需要注意描述中提及的安全问题,确保已修复相关漏洞,防止非法文件上传。
7.10 处理文件上传 7.10.1 使用multipart请求 7.10.2 上传和数据绑定 7.11 本章小结 第8章 groovycservercpages 8.1 基础知识 8.1.1 理解模型 8.1.2 页面指令 8.1.3 ...
将Grails Plugin Converters 2.3.1与Box Java SDK v2 结合,开发者可以在Grails应用中直接处理Box上的文件数据,比如,从Box下载文件并将其转换成特定格式,或者接收用户上传的经过转换的数据并存储到Box账户中。...
在Grails中,我们可以使用`params.upload`来访问上传的文件,然后将其保存到指定的目录。 ```groovy def uploadImage = { def file = request.getFile('upload') if (file != null && !file.empty) { def ...
自己买的书,然后用扫描机扫描的,整个文件太大了,不能一次性上传上来,所以拆成3个part。 我自己学grails很想看这本书,结果网上没有,就自己去买了,然后共享给需要的人。 如果有什么问题请联系我下架。
- **处理文件上传**:讲解了如何处理用户上传的图片文件。 - **上传到文件系统**:介绍了如何将文件保存到文件系统。 - **从数据库中递交相片**:探讨了如何将图片数据保存到数据库。 **7.6 通过过滤器拦截请求** ...
- **文档上传与下载**:系统应具备文档上传、预览、下载以及版本控制等功能,确保用户可以方便地管理个人或团队的文档资源。 - **权限管理**:通过角色和权限控制,实现对文档访问的精细化管理,例如,仅特定用户...
- **下载与引入FCK Editor**:首先,你需要从FCK Editor的官方网站下载最新版本的编辑器,然后将其解压到Grails项目的`web-app`目录下的`js`或`lib`子目录。 - **创建Controller**:在Grails中,创建一个用于处理富...
自己买的书,然后用扫描机扫描的,整个文件太大了,不能一次性上传上来,所以拆成3个part。 我自己学grails很想看这本书,结果网上没有,就自己去买了,然后共享给需要的人。 如果有什么问题请联系我下架。
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...
最后,确保你的Grails应用能够处理文件上传,可能需要配置安全设置,例如允许特定的MIME类型和文件大小。同时,你可能还需要考虑文件重命名、存储路径、权限控制等问题。 通过以上步骤,你已经在Grails应用中成功...