文件上传原理及流程

感谢原博主:

http://blog.sina.com.cn/s/blog_8f32dc250100wva8.html


一、HTTP文件上传

html
<input type=”file” name=”xxx”> 
type:类型
name:名字
method:post (post与get的区别是,post下参数值不会放在url后面,更加安全)
enctype:属性规定在发送到服务器之前应该如何对表单数据进行编码。


form表单
multipart/form-data:不对字符编码,在使用包含文件上传控件的表单时,必须使用该值。
对于multipart/form-fata类型的表单,浏览器上传的实体内容中的每个表单字段元素的数据之间,
用字段分割线进行分割,两个分割界线间的内容成为一个分区,每个分区的内容可以被看做两部分,
一部分是对表单元字段元素进行描述的描述头,
另一部分是表单元字段元素的主体内容


字段(content-type)
-----------------------
描述头(换行\n)
分区 (空行\r \n)
\r主体内容
-----------------------


二、服务器
1.服务器端程序收到"multipart/form-data"类型的http请求消息
2.读取这个请求消息里面的实体内容
3.解析每个分区的数据
4.从每个分区中解析出描述头和主体内容部分


要在jsp里面获得上传的文件,就是通过request.getInputStream()来得到上传的整个post实体的流。
1.用request.getHeader("Content-Type")来取得实体内容的分解字符串
2.根据http协议,分析取得的上传实体流,把文件部分筛选出来
3.保存在故武器的磁盘文件中
4.由于上传文件时,form的属性enctype="multipart/form-data",所以其他表单参数在上传时无法得到
除了筛选出文件进行保存,还应该把其他的参数一起取出保存,以便在jsp中调用


具体方法如下:
1.根据request获得文件输入流
2.依次读取行,此时进行两部分内容的处理
 (1)获取文件名,以filename = "xxx"来标识一个文件头
 (2)获取其他表单值,以name="xxx"来标识一个表单头
 都以流头的字符标识为值结束
 
实体内容内部的字段分隔界线是在content-type头中指定的字段分隔界线前面增加了两个"-"号而形成的。
(由浏览器随机生成,保证上传内容不重复)


当找到一个分区的开始位置后,程序还需要分辨出分区中的描述头和主体内容,并对他们分开储存。
如何辨别描述头和主体部分?
每个分区的描述头和主体内容之间有一个空行,描述头后面有个换行。
因此描述头和主体之间有"\n","\r","\n","\r"这四个连续的字节内容进行分割,
并在字节数组缓冲区buffer中寻找这个特殊的分割界限来识别他俩。


根据督导的文件信息,比如文件名,文件大小等,判断是否合法,
合法就返回,不合法就创建同名文件并将其删除


日常中推荐使用组件(smartUpload,FileUpload,Cos)
因为:
1.读取文件大小限制(fileupload是创建临时文件)
2.读取效率限制


这类组件的使用及封装方式:
MultipartRequest mu = new MultipartRequest(HttpServletRequest request,Directory,MaxSize,”gbk”);






 









































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值