- 5
- 0
- 约9.67千字
- 约 8页
- 2017-06-05 发布于湖北
- 举报
20121227 周四
文件的上传和下载
1. What is 文件上传? what is 文件下载?
文件上传:用户通过浏览器向服务器提交文件,并由服务器保存
文件下载:用户通过浏览器从服务器上得到一些文件数据,并在浏览器端保存
2. Why use 文件上传? Why use 文件下载?
web应用功能需要
3. How 实现文件上传?
** 实现文件上传的流程
1、在jsp页面添加form表单:
(1) input type=file
(2) 必须把 form 的 enctype 属性设为 multipart/form-data,
enctype 属性取值:
application/x-www-form-urlencoded:表单 enctype 属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用”%HH”代替(H 代表十六进制数字)。对于大容量的二进制数据或包含非 ASCII 字符的文本来说,这种编码不能满足要求。
multipart/form-data:form 设定了enctype=“multipart/form-data”属性后,表示表单以二进制传输数据 。在浏览器在上传文件时,将把文件数据附带在 http 请求消息体中,并使用 MIME 协议对上传文件进行描述,以方便接收方对上传数据进行解析和处理。
(3) 表单提交的方式要是 post(get的请求体有大小限制,而post无大小限制)
注意:enctype=“multipart/form-data”的表单在servlet中不能再像以往那样通过 request.getParameter()那样得到请求中的参数数据(数据格式不对),另有取值的方式
2、为了方便用户处理上传数据,Apache 提供了一个用来处理表单文件上传的开源组件: Commons-fileupload 和Commons-io ,Commons-fileupload 组件从 1.1 版本开始依赖 commons-io
其主要的接口和类有三个:
ServletFileUpload 负责处理上传的文件数据,并将每部分的数据封装成一到 FileItem 对象中。
isMultipartContent(HttpServletRequest request) 判断上传表单是否为 multipart/form-data
parseRequest(HttpServletRequest request) :得到请求所有表单项的数据对象,返回一 个ListFileItem
setFileSizeMax(long fileSizeMax) 设置上传文件的最大值。
setSizeMax(long sizeMax) 设置上传文件总量的最大值
2.DiskFileItemFactory 是创建 FileItem 对象的工厂,在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。
setSizeThreshold(int sizeThreshold,File repository )
设置内存缓冲区的大小,默认值为 10k 当上传文件大于缓冲区大小时,fileupload 组件将使用临时文件缓存上传文件
setRepository(File repository) 指定临时文件目录,默认值为 System.getProperty(java.io.tmpdir)
FileItem :代表一个表单项数据,可以获得表单项的数据,可以判断是否为普通表单项
isFormField():为true,为普通表单项;为false,为file表单项
getFieldName() 获取的是普通表单项的表单项名。
getString(encod) 获取的是普通表单项的表单项值。
getName() 获取的是上传文件的简单文件名(有些浏览器(ie)会返回文件的全路径 名,所有在此处最好加以判断)
3. 基本的原理为:
FileUpload组件将页面提交的所有元素(普通form表单域,如text和文件域file)都看作一样的FileItem,这样上传页面提交的 request请求也就是一个FileItem的有序组合,FileUpload组件可以解析该request,并返回一个一个的FileItem。而对每一个FileItem,FileUpload组件可以判断出它是普通form表单域还是文件file域,从而根据不同的类型,采取不同的操作--如果是表单域,就读出其值,如果是文件域,就保存文件到服务器硬盘上或者内存中。
4、fileuplpad 组件的具体工作流程
原创力文档

文档评论(0)