使用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 上传表单示例

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

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

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

在前面的示例中,标签中属性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}” ) )

}

}

时间: 2024-10-03 23:33:44

使用multipart请求处理文件上传的相关文章

Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简介 Spring内置的multipart支持会处理web应用中的文件上传.你可以启用该支持 -- 通过可插拔的MultipartResolver对象们,它们都是定义在 org.springframework.web.multipart 包中.Spring提供了一个MultipartResolver实

multipart/form-data 文件上传表单中 传递参数无法获取的原因!

1.什么是multipart/form-data 首先我们需要明白在html中的enctype属性, enctype:规定了form表单在发送到服务器时候编码方式.他有如下的三个值. ①application/x-www-form-urlencoded.默认的编码方式. 但是在用文本的传输和MP3等大型文件的时候,使用这种编码就显得 效率低下. ②multipart/form-data . 指定传输数据为二进制类型,比如图片.mp3.文件. ③text/plain. 纯文体的传输. 空格转换为

Struts2单文件上传

第一步:首先写个上传文件的页面(简单的一个form表单) <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传</title> </head> <body> <h1>文件上传</h1> <br><br>

Struts2多文件上传

第一步:首先创建一个多文件上传的页面 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>多文件上传</title> </head> <body> <h1>多文件上传</h1> <br><br> <form

Struts2 文件上传,下载,删除

本文介绍了: 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用FileUtil上传 6.使用IOUtil上传 7.使用IOUtil上传 8.使用数组上传多个文件 9.使用List上传多个文件 ----1.基于表单的文件上传----- fileupload.jsp <body> <form action="showFile.jsp" na

php面向对象文件上传

文件上传类 Upload.class.php <?php class Upload { private $path; private $n; private $ext; private $length; public function __construct($path = './', $n = 3, $ext = ['jpg','gif','png','rar','ppt','doc'], $length = 20971520) { $this->path = $path; $this-&g

FileUpload系列:(1)文件上传的思路和示例

文件上传:第(1)阶段,处理流程 1.浏览器的表单上传文件到Tomcat服务器时,表单中的数据(包括普通文本域,也包括文件)被封装成了request对象 2.要想保存这些表单数据(普通文本.文件),就必须把这些信息从request对象抽取出来 3.把这些表单数据抽取出来的一个类叫做ServletFileUpload. 4.ServletFileUpload有一个方法parseRequest(HttpServletRequest)(A list of FileItem instances pars

node07---post请求、表单提交、文件上传

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="dopost" method="post" enctype="multipart/fo

关于单文件上传函数封装

前端页面 <form action="doAction1.php" method="post" enctype="multipart/form-data"> 文件上传<input type="type" name="myFile"></br> <input type="submit" value="上传"> </f