使用multipart请求处理文件上传
在开发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实例可以用来管理文件上传,但实际应用常常需要读取文件内容。
使用multipart请求处理文件上传的更多相关文章
- Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...
- spring MVC multipart处理文件上传
在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——Spring MVC其中的一个优势.Spring通过对Serv ...
- multipart/form-data 文件上传表单中 传递参数无法获取的原因!
1.什么是multipart/form-data 首先我们需要明白在html中的enctype属性, enctype:规定了form表单在发送到服务器时候编码方式.他有如下的三个值. ①applica ...
- Content-Type: multipart/form-data;文件上传利用
当我们找到一个文件上传接口时,发现他的MIME类型检测为Content-Type: multipart/form-data;时,我们就可以尝试下面几种方法来绕过限制. ---------------- ...
- multipart/form-data文件上传
form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式 application/x-www-form-urlencoded:默认编码方式 multipart/form-d ...
- ajax 'Content-Type': 'multipart/form-data' ->文件上传
'Content-Type': 'multipart/form-data' :指定传输数据为二进制数据,例如图片.mp3.文件
- 构建multipart/form-data实现文件上传
构建multipart/form-data实现文件上传 通常文件上传都是通过form表单中的file控件,并将form中的content-type设置为multipart/form-data.现在我们 ...
- Struts2多文件上传
第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content=&q ...
- Struts2单文件上传
第一步:首先写个上传文件的页面(简单的一个form表单) <html> <head> <meta http-equiv="Content-Type" ...
随机推荐
- AX 2012 SSRS print setting-报表打印输出设置
static void callerreport_printsetting(Args _args) { LedgerJournalController controller = new LedgerJ ...
- C#_GDI+详细教程(图形图像编程基础)
第7章 C#图形图像编程基础 本章主要介绍使用C#进行图形图像编程基础,其中包括GDI+绘图基础.C#图像处理基础以及简单的图像处理技术. 7.1 GDI+绘图基础 编写图形程序时需要使用GDI( ...
- C#GridViewExport帮助类,美化导出
1.将整GridView的数据导出到Excel中关增加一个效果线做美化 最新的GridViewExport操作类 using System.Data; using System.Web; using ...
- VR全景智慧城市-720全景项目行业应用
VR虚拟现实.VR全景概念已成为科技发展热议的焦点.在这样的市场大环境下,全景智慧城市做为一家对大众创新万众创业和用户体验为理念的VR全景城市化信息搜素平台平地而生成为的VR行业领跑者,致力VR全景V ...
- 一个最小化的SpringBoot项目
项目结构 项目基于Maven管理,注意使用了父pom <parent> <groupId>org.springframework.boot</groupId> &l ...
- php函数的引用返回
<?php function &test(){ static $b = 1; $b += 2; return $b; } $a = &test(); $a =8; $c = te ...
- Mysql常用命令行大全——转载
转载地址:http://www.blogjava.net/supperchen/archive/2012/10/11/389340.html 第一招.mysql服务的启动和停止 net stop my ...
- "Asp.Net Web Api MediaTypeFormatter Error for x-www-formurlencoded data" 解决方法
遇到标题中所说的问题原因是使用 jQuery AJAX 以 POST 方式调用 Asp.Net Web API .解决办法请看以下代码中有注释的部分. public static class WebA ...
- 遇到一个奇葩的问题,could not load the assembly file XXX downloaded from the Web
在我这编译好好滴,发给客户那边居然不通过,报could not load the assembly file:///xxx.dll, 查阅了一些文档后,发现原来是文件的安全问题,是由于我把文件压缩打包 ...
- Selenium2+python自动化7-xpath定位
前言 在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. ...