在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——Spring MVC其中的一个优势。Spring通过对Servlet API的HttpServletRequest接口进行扩展,使其能够很好地处理文件上传。扩展后的接口名为org.springframework.web.multipart.MultipartHttpServletRequest,其内容如清单7-31所示。

清单7-31  org.springframework.web.multipart.MultipartHttpServletRequest接口

interface MultipartHttpServletRequest extends HttpServletRequest {

public MultipartFile getFile(String name);

public Map getFileMap();

public Iterator getFileNames();

}

如清单所示,MultipartHttpServletRequest接口简单地扩展了默认的HttpServletRequest接口,并提供一些用来处理请求文件的方法。

7.10.1  使用multipart请求

实际上只要发现一个multipart请求,就表明在控制器实例中存在一个实现Multipart HttpServletRequest接口的request对象。我们可以通过清单7-31所示的方法来访问multipart请求中的上传文件,不过在处理上传文件之前,先来看一下上传表单的内容,如清单7-32所示。

清单7-32  上传表单示例

<form action="upload" enctype="multipart/form-data">

<input type="file" name="myFile" />

<input type="submit" value="Upload! " />

</form>

粗体显示的是需要注意的部分,实际上一个上传表单只需要满足如下两点。

l  enctype属性的属性值设为multipart/form-data。

l  input的type属性的属性值设为file。

在前面的示例中,<input>标签中属性type的值为file,且name属性的值为myFile,之所以需要name属性值,是因为在使用接口MultipartHttpServletRequest的getFile方法时需要使用name属性的值。例如在清单7-33中,代码中的upload操作会从请求中读取上传文件。

清单7-33  读取上传文件

def upload = {

def file = request.getFile('myFile')

// 处理该文件

}

注意getFile方法不会返回一个java.io.File的实例,而是返回org.springframework.web. multipart.MultipartFile的一个实例,关于org.springframework.web.multipart.MultipartFile的详细信息,请参考清单7-34。如果在请求中没有找到文件则getFile方法返回null。

清单7-34  org.springframework.web.multipart.MultipartFile接口

interface MultipartFile {

public byte[] getBytes();

public String getContentType();

public java.io.InputStream getInputStream();

public String getName();

public String getOriginalFilename();

public long getSize();

public boolean isEmpty();

public void transferTo(java.io.File dest);

}

在MultipartFile接口中定义了如下很多有用的方法。

l  使用getSize()方法获得文件长度,以此决定允许上传的文件大小。

l  使用isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。

l  使用getInputStream()方法将文件读取为java.io.InputStream流对象。

l  使用getContentType()方法获得文件类型,以此决定允许上传的文件类型。

l  使用transferTo(dest)方法将上传文件写到服务器上指定的文件。

例如,如果上传的文件不为空并且大小不小于1024字节,那么可以按照清单7-35中的代码来实现。

清单7-35  文件上传示例

def upload = {

def file = request.getFile('myFile')

if(file && !file.empty && file.size < 1024) {

file.transferTo( new java.io.File( "/local/server/path/${file.name}" ) )

}

}

直接使用MultipartHttpServletRequest实例可以用来管理文件上传,但实际应用常常需要读取文件内容。

spring MVC multipart处理文件上传的更多相关文章

  1. 关于我使用spring mvc框架做文件上传时遇到的问题

    非常感谢作者 原文:https://blog.csdn.net/lingirl/article/details/1714806 昨天尝试着用spring mvc框架做文件上传,犯了挺多不该犯的毛病问题 ...

  2. spring mvc中的文件上传

    使用commons-fileupload上传文件所需要的架包有:commons-fileupload 和common-io两个架包支持,可以到Apache官网下砸. 在配置文件spring-mvc.x ...

  3. spring mvc 简单的文件上传与下载

    上传文件有很多种方法,这里主要讲解的是spring mvc内提供的文件上传 前提使用:spring mvc 在这个之前我们需要把环境给配置好 1:springmvc的XML配置文件加上这一段就即可, ...

  4. Spring MVC 全局异常处理&文件上传

    Spring MVC 全局异常处理 使用SimpleMappingExceptionResolver实现异常处理 在welcome-servlet.xml进行如下配置: <bean class= ...

  5. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

  6. Spring MVC学习笔记——文件上传

    1.实现文件上传首先需要导入Apache的包,commons-fileupload-1.2.2.jar和commons-io-2.1.jar 实现上传就在add.jsp文件中修改表单 enctype= ...

  7. Spring MVC - MultipartFile实现文件上传(单文件与多文件上传)

    准备工作: 需要先搭建一个spirngmvc的maven项目 1.加入jar包 <dependency> <groupId>commons-fileupload</gro ...

  8. Spring MVC + Java 多文件上传及多文件中转上传

    1.html内容 <div> <form method="post" action="/Cyberspace/main/informationBatch ...

  9. 1.6(Spring MVC学习笔记)文件上传与下载

    一.文件上传 实现文件上传多数是采用表单提交数据, 但对于进行文件上传的表单需要满足一下几个条件 1.表单的method设置为post 2.表单的enctype设置为multipart/form-da ...

随机推荐

  1. c# HttpClient获取网页源码

    #region 获取网页源码 public static string HttpClientGetHtmls(string url) { try { var client = new HttpClie ...

  2. LeetCode-day04

    35. Same Tree 判断两棵树相同 36. Invert Binary Tree 翻转树 37. Symmetric Tree 判断树是不是镜像对称的 38. Maximum Depth of ...

  3. 剑指offer 面试68题

    面试68题: 题目:求树中两个节点的最低公共祖先 待解决...

  4. C#如何打印RichTextBox控件的内容

      本任务的内容 摘要 创建 RichTextBoxPrintCtrl 控件 测试控件 参考 概要 本分步指南介绍了如何打印 RichTextBox 控件的内容.RichTextBox 控件没有提供任 ...

  5. Loadrunder之脚本篇——事务时间简介

    事务概念 事务是指用户在客户端做一种或多种业务所需要的操作集(actions),通过事务开始和结束函数可以标记完成该业务所需要的操作内容(脚本section).定义事务来衡量服务器的性能,例如,你可以 ...

  6. Scalability, Availability & Stability Patterns

    https://blog.csdn.net/ajian005/article/details/6191814   一 自我有要求的读者应该提出问题:(研习:掌握层次:)能力级别:不会(了解)——领会( ...

  7. Parquet and ORC

    http://dongxicheng.org/mapreduce-nextgen/columnar-storage-parquet-and-orc/ 相比传统的行式存储引擎,列式存储引擎具有更高的压缩 ...

  8. Centos6.5安装apache

    1:下载 官网: http://www.apache.org/ 官网下载很慢,从别的地方下载 2:安装 tar -zxvf /usr/local/httpd-2.2.9.tar.gz cd /usr/ ...

  9. firefox和chrome实现页面打印自动分页

    在Firefox和chrome中直接调用打印功能的js方法是 window.print(); 但是如果页面很长,那么就需要分页,这时只需要在页面中添加css属性即可,如果想自动分页,则如下所示 < ...

  10. 【codevs1002】搭桥(prim)

    题目描述: 这是道题题意有点迷(或者是我语文不好),但其实实际上求的就是图中连通块的个数,然后在连通块与连通块之间连边建图跑最小生成树.但是……这个图可能是不连通的……求桥的数量和总长 于是我立刻想到 ...