Grails 图片上传
<g:form controller="attachments" action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="上传"/> </g:form>
def upload() { def file = request.getFile("file") if (file.empty) { flash.message = message(code: '请选择要上传的文件') redirect(controller: "attachments", action: "create") } def fileType = file.getOriginalFilename().split('\\.')[-1] if (!(fileType in ['jpg', 'png', 'jpeg','pdf', 'doc', 'docx'])) { flash.message = message(code: '文件格式不支持') redirect(controller: "attachments", action: "create") } def webrootDir = servletContext.getRealPath("/") File fileFolder = new File(webrootDir, "images/tempFile.${fileType}") file.transferTo(fileFolder) // 压缩图片 def fileSize = request.getContentLength() if (fileType in ['jpg', 'png', 'jpeg'] && fileSize > 1024 * 1024) { def compressImg = fileServerService.compress(fileFolder.getAbsolutePath(), 1920, 1080) fileFolder = new File(compressImg) } }
为防止过大图片消耗内存,且方便存储,决定对过大文件(>1M)进行压缩。 等比压缩,图片大小可以自己指定。若图片大小不想改变,则可以将宽高指定成屏幕大小,如:w=1920,h=1080
def compress(String fileName, Integer w, Integer h) { File file = new File(fileName) Image img = ImageIO.read(file) Integer width = img.getWidth(null) Integer height = img.getHeight(null) if (width / height > w / h) { h = (Integer) (height * w / width) } else { w = (Integer) (width * h / height) } BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB) // Image.SCALE_AREA_AVERAGING、Image.SCALE_SMOOTH 这两种方式压缩效果较好 image.getGraphics().drawImage(img.getScaledInstance(w, h, Image.SCALE_SMOOTH),0, 0, null) File destFile = new File(fileName) FileOutputStream out = new FileOutputStream(destFile) JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out) encoder.encode(image) return fileName }
目前为止,文件已经存储到项目的/images文件夹下,若想将文件统一管理,可以生产一个文件管理服务,通过接口调用,需要将图片转成Base64码传输。
def upload() { // 接上面的upload // 将临时文件存储转成 Base64 FileInputStream inputStream = new FileInputStream(fileFolder) ByteArrayOutputStream output = new ByteArrayOutputStream() byte[] fileBytes = new byte[inputStream.available()] Integer length = 0 while ((length = inputStream.read(fileBytes)) != -1) { output.write(fileBytes, 0, length) } def encoded = fileBytes.encodeBase64().toString() // 调用接口,返回文件名(包括路径+名称) def fileName = fileServerService.uploadServer(encoded, fileType) }
文件服务器接收到Base64码,进行解码形成图片后存储。
def uploadServer() { def encoded = params["encoded"] def fileType = params["fileType"] def externalId = UUID.randomUUID().toString() def fileName = "images/${externalId}.${fileType}" def webrootDir = servletContext.getRealPath("/") BASE64Decoder decoder = new BASE64Decoder() byte[] image = decoder.decodeBuffer(encoded) File fileImage = new File(webrootDir, fileName) fileImage.append(image) render externalId as JSON } def removeServer() { def externalId = params["externalId"] def fileType = params["fileType"] def webrootDir = servletContext.getRealPath("/") def fileName = "images/${externalId}.${fileType}" File file = new File(webrootDir, fileName) if (file.isFile() && file.exists()) { file.delete() render status: 200 } }
相关推荐
标题中的"grails-fck-editor-0.3.zip_grails_grails-fck-editor"表明这是一个与Grails框架相关的插件,具体来说是FCKeditor的一个版本。FCKeditor是一款广泛使用的开源富文本编辑器,它允许用户在网页上创建和编辑...
groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part2 共两个包,解压后需要将扩展名.zip.bak改名为.zip重新解压。 http://dist.springsource.com/release/STS/3.8.1.RELEASE/dist/ e4.6/spring-tool-...
groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。
Grails 是一个基于 Java 平台的开源 web 应用框架,它采用了 Groovy 编程语言,使得开发过程更为简洁高效。`grails-doc-CN-1.0.rar` 文件包含的是 Grails 1.0 版本的中文参考文档,对于那些不熟悉英文文档或者想要...
在 `grails-app/domain` 创建 `User.groovy` 文件定义用户类,然后在 `grails-app/controllers/UserController.groovy` 编写控制器,处理用户的注册、登录等操作。在 `grails-app/views/user` 下创建相应的 GSP 页面...
Grails是一种基于Groovy语言的开源Web应用框架,它构建在Spring Boot之上,旨在提高开发者的生产力和灵活性。Grails 2.3.6是该框架的一个特定版本,发布于2014年,提供了许多改进和新特性,旨在优化开发流程。 1. *...
《Grails Datastore GORM Plugin Support 2.0.4.RELEASE:开源项目的代码生成与Android MVC模式解析》 在IT行业中,开发高效且可维护的软件系统是至关重要的。Grails Datastore GORM Plugin Support 2.0.4.RELEASE...
《Grails核心源码解析——基于版本2.2.2》 Grails,作为一个基于Groovy语言的全栈式Web应用框架,深受开发者喜爱。它以其简洁的语法、丰富的插件系统以及对Spring和Hibernate的无缝集成,为开发高效、灵活的Web应用...
**Grails Quartz 0.4.1 插件详解** `Grails` 是一个基于 `Groovy` 语言的敏捷开发框架,它简化了构建基于Java平台的Web应用。而`Quartz` 是一个功能丰富的开源作业调度框架,用于执行定时任务。在`Grails` 中,`...
Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 Grails这个独特的框架被视为是提升工程师生产效率的动态工具,因为其...
3. 扩展性:FCKEditor插件可以与其他Grails插件(如文件上传插件)配合使用,提供更强大的功能,如图片管理和多媒体资源管理。 4. 版本兼容:虽然grails-fckeditor-0.9.5是较旧的版本,但理解其工作原理有助于我们...
《Grails Web URL Mappings 2.5.4:开源项目的URL路由艺术》 在Web开发领域,路由是连接用户请求与服务器响应的核心机制。在Grails框架中,URL映射(URL Mappings)扮演了至关重要的角色,它定义了应用程序如何响应...
给下载不方便的朋友提供一点点便利,最新版本。 Grails 4 ships with the following dependency upgrades: Groovy 2.5.6 GORM 7 and Hibernate 5.4 (now the default version of Hibernate for new applications) ...
《Grails Acegi 0.5插件:深入解析与应用》 在Web应用程序开发领域,安全性始终是不可忽视的重要一环。Grails Acegi 0.5插件,作为一个针对Grails框架的安全管理插件,为开发者提供了一种强大且灵活的方式来实现...
《Grails框架文档2.0.0详解》 Grails是一种基于Java的开源Web应用程序框架,它采用Groovy编程语言,旨在简化开发流程并提高生产力。`grails-docs-2.0.0`是Grails 2.0.0版本的官方文档,包含了丰富的指南、API参考...
**Grails 2.4.4 用户手册** **一、Grails 框架概述** Grails 是一个基于 Groovy 语言的开源全栈式Web应用框架,它旨在提高开发效率,提供简洁、灵活的代码结构,以及强大的自动化工具。Grails 2.4.4 是该框架的一个...
《Grails框架API文档详解——基于grails-docs-1.0》 Grails是一种基于Groovy语言的开源Web应用框架,它简化了Java开发,提供了丰富的功能和强大的工具,深受开发者喜爱。本文将深入探讨grails-docs-1.0版本的API...
Spring Websocket Grails插件 该插件旨在使Spring 4.0中引入的websocket支持可用于Grails应用程序。 您也可以使用相应的Spring docs / apis / samples作为参考。 在本自述文件中多次提到了这一点,因为其中详细...
在压缩包子文件的文件名称列表中,我们看到"grails-1.1.1",这应该是Grails框架的核心文件夹,包含了运行Grails应用所需的所有库和可执行文件。在这个文件夹内,通常会包含以下结构: 1. `bin`:存放可执行脚本,如...