`

Grails - 图片上传、下载、等比压缩

阅读更多

    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-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

    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

    groovy-grails-tool-suite-3.6.4.RELEASE-e4.4.2-win32-x86_64.part1 共两个压缩包,解压后将扩展名.zip.bak改为.zip再次解压。

    grails-doc-CN-1.0.rar

    Grails 是一个基于 Java 平台的开源 web 应用框架,它采用了 Groovy 编程语言,使得开发过程更为简洁高效。`grails-doc-CN-1.0.rar` 文件包含的是 Grails 1.0 版本的中文参考文档,对于那些不熟悉英文文档或者想要...

    Groovy&Grails - 指南.ppt

    在 `grails-app/domain` 创建 `User.groovy` 文件定义用户类,然后在 `grails-app/controllers/UserController.groovy` 编写控制器,处理用户的注册、登录等操作。在 `grails-app/views/user` 下创建相应的 GSP 页面...

    grails-2.3.6.zip

    Grails是一种基于Groovy语言的开源Web应用框架,它构建在Spring Boot之上,旨在提高开发者的生产力和灵活性。Grails 2.3.6是该框架的一个特定版本,发布于2014年,提供了许多改进和新特性,旨在优化开发流程。 1. *...

    grails-datastore-gorm-plugin-support-2.0.4.RELEASE.zip

    《Grails Datastore GORM Plugin Support 2.0.4.RELEASE:开源项目的代码生成与Android MVC模式解析》 在IT行业中,开发高效且可维护的软件系统是至关重要的。Grails Datastore GORM Plugin Support 2.0.4.RELEASE...

    grails-core源码

    《Grails核心源码解析——基于版本2.2.2》 Grails,作为一个基于Groovy语言的全栈式Web应用框架,深受开发者喜爱。它以其简洁的语法、丰富的插件系统以及对Spring和Hibernate的无缝集成,为开发高效、灵活的Web应用...

    grails-quartz-0.4.1

    **Grails Quartz 0.4.1 插件详解** `Grails` 是一个基于 `Groovy` 语言的敏捷开发框架,它简化了构建基于Java平台的Web应用。而`Quartz` 是一个功能丰富的开源作业调度框架,用于执行定时任务。在`Grails` 中,`...

    grails-2.5.6

    Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate等开源框架之上,是一个高生产力一站式框架。 Grails这个独特的框架被视为是提升工程师生产效率的动态工具,因为其...

    grails 中文文档+grails-fckeditor-0.9.5.zip插件

    3. 扩展性:FCKEditor插件可以与其他Grails插件(如文件上传插件)配合使用,提供更强大的功能,如图片管理和多媒体资源管理。 4. 版本兼容:虽然grails-fckeditor-0.9.5是较旧的版本,但理解其工作原理有助于我们...

    grails-web-url-mappings-2.5.4.zip

    《Grails Web URL Mappings 2.5.4:开源项目的URL路由艺术》 在Web开发领域,路由是连接用户请求与服务器响应的核心机制。在Grails框架中,URL映射(URL Mappings)扮演了至关重要的角色,它定义了应用程序如何响应...

    grails-4.0.3.rar

    给下载不方便的朋友提供一点点便利,最新版本。 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.zip

    《Grails Acegi 0.5插件:深入解析与应用》 在Web应用程序开发领域,安全性始终是不可忽视的重要一环。Grails Acegi 0.5插件,作为一个针对Grails框架的安全管理插件,为开发者提供了一种强大且灵活的方式来实现...

    grails-docs-2.0.0

    《Grails框架文档2.0.0详解》 Grails是一种基于Java的开源Web应用程序框架,它采用Groovy编程语言,旨在简化开发流程并提高生产力。`grails-docs-2.0.0`是Grails 2.0.0版本的官方文档,包含了丰富的指南、API参考...

    Grails-2.4.4-用户手册

    **Grails 2.4.4 用户手册** **一、Grails 框架概述** Grails 是一个基于 Groovy 语言的开源全栈式Web应用框架,它旨在提高开发效率,提供简洁、灵活的代码结构,以及强大的自动化工具。Grails 2.4.4 是该框架的一个...

    grails-docs-1.0

    《Grails框架API文档详解——基于grails-docs-1.0》 Grails是一种基于Groovy语言的开源Web应用框架,它简化了Java开发,提供了丰富的功能和强大的工具,深受开发者喜爱。本文将深入探讨grails-docs-1.0版本的API...

    grails-spring-websocket

    Spring Websocket Grails插件 该插件旨在使Spring 4.0中引入的websocket支持可用于Grails应用程序。 您也可以使用相应的Spring docs / apis / samples作为参考。 在本自述文件中多次提到了这一点,因为其中详细...

    grails-bin-1.1

    在压缩包子文件的文件名称列表中,我们看到"grails-1.1.1",这应该是Grails框架的核心文件夹,包含了运行Grails应用所需的所有库和可执行文件。在这个文件夹内,通常会包含以下结构: 1. `bin`:存放可执行脚本,如...

Global site tag (gtag.js) - Google Analytics