SpringMVC的 transferTo使用
在开发Web应用程序时比较常见的功能之一,就是允许用户利用multipart请求将本地文件上传到服务器,而这正是Grails的坚固基石——SpringMVC其中的一个优势。Spring通过对ServletAPI的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请求,就表明在控制器实例中存在一个实现MultipartHttpServletRequest接口的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}" ) )
}
}
直接使用MultipartHttpServletRequ
est实例可以用来管理文件
SpringMVC的 transferTo使用的更多相关文章
- springmvc的图片上传与导出显示
1.前端文件上传需要在form表单内添加enctype="multipart/form-data" ,以二进制传递: 2.web.xml文件内配置 <servlet-mapp ...
- SpringMVC上传文件的三种方式(转)
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
- springmvc 上传下载
springmvc文件上传下载在网上搜索的代码 参考整理了一份需要使用的jar.commons-fileupload.jar与commons-io-1.4.jar 二个文件 1.表单属性为: enct ...
- springMVC文件上传
参考的地址:http://www.tuicool.com/articles/nMVjaiF 1.需要使用的jar. commons-fileupload.jar与commons-io-1.4.jar二 ...
- SpringMVC上传文件的三种方式
直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...
- springMVC含文件上传调用ajax无法连接后台
springMVC在使用ajax进行后台传值的时候发现找不到对应的requestMapping(""),无法进入后台,在多次试验后确定是 MultipartFile对象与ajax冲 ...
- SpringMVC文件上传注意事项
简介 我在使用 idea 上传文件时遇到一些问题,费了好些时间,最后还是的队友来帮忙. 问题出现在没有熟练使用 IDE,采用 SpringMVC 上传文件主要注意几个事项. 1. 配置 bean 在 ...
- 深入springMVC源码------文件上传源码解析(下篇)
在上篇<深入springMVC------文件上传源码解析(上篇) >中,介绍了springmvc文件上传相关.那么本篇呢,将进一步介绍springmvc 上传文件的效率问题. 相信大部分 ...
- SpringMVC文件上传下载
在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...
随机推荐
- python多任务——协程的使用
使用yield完成多任务 import time def test1(): while True: print("--1--") time.sleep(0.5) yield Non ...
- Android新版xUtils3工具类相关debug
首先出现问题是 build.gradle中的csayısıom.lidroid.xutils:xutils:2.6.13报错了,所以想到是版本的问题,github上搜了xutils发现有新版xutil ...
- idea自定义注释
类配置位置: 方法配置位置 配置内容 * * @Author *** * @Date $date$ $time$ $param$ * @return $return$ * @Description * ...
- python多线程、多进程、协程笔记
import threading import time import multiprocessing import asyncio movie_list = ['斗破.avi', '复仇者联盟.mp ...
- 多线程的些许理解(平台x86,具体考虑linux,windows)
多线程的些许理解 一.体系架构 1.原子操作 1) 定义 不可中断的一个或者一系列操作,也就是不会被线程调度机制打断的操作,在运行期间不会有任何的上下文切换(context switch). 2) 我 ...
- Navicat安装、使用教程
下载地址:Navicat的安装包及破解文件 一. Navicat安装 Navicat既可安装在服务器端,也可以安装在客户端.安装在服务器端,导入数据时可使用默认用户,也可以使用远程用户:安装在客户端, ...
- Linux分布式消息队列RocketMQ部署与监控--双Master
环境准备:CentOS_6.5_x64 IP: 192.168.0.249 dbTest249 Master1 IP: 192.168.0.251 webTest251 Master2 下载 ali ...
- tar.xz压缩工具使用(转)
XZ压缩最新压缩率之王 xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 我是在下载phpmyadmin的时候看到这种压缩格式的,phpmyadmin压缩包xz ...
- Python 3.8测试阶段正式开始,发布Beta 1版
上周,Python背后的团队宣布发布了Python 3.8.0b1 版本,这是Python 3.8计划的四个beta发行预览版中的第一个.此版本标志着beta阶段的开始,您可以在此阶段测试新特性,并使 ...
- Chrome安装Axure插件axure-chrome-extension
用Chrome打开Axure发布的原型图打不开,提示需要安装axure-chrome-extension插件,如下图提示 下面记录一下安装过程,其实很简单,插件没必要从网上到处找,在你发布的路径下就有 ...