http上传原理
来源:互联网 发布:淘宝怎么加直播间链接 编辑:程序博客网 时间:2024/06/05 19:10
HTTP 文件上传的基本原理:
使用html 的<input type=”file” name=”xxx”> 标签,提交form 的几个属性必须为: method=post encType=multipart/form-data;
method 属性必须设为post的原因是:值不是放在URL之后传递到服务器的;
encType属性:这个属性管理的是表单的MIME编码
几个属性详解:
application/x-www-form-urlencoded 在发送前编码所有字符(默认)
multipart/form-data 不对字符编码,在使用包含文件上传控件的表单时,必须使用该值;对于“multipart/form-data”类型的form表单,浏览器上传的实体内容中的每个表单字段元素的数据之间用字段分隔界线进行分割,两个分隔界线间的内容称为一个分区,每个分区中的内容可以被看作两部分,一部分是对表单字段元素进行描述的描述头,另外一部是表单字段元素的主体内容
text/plain 空格转换为“+”,不对特殊字符编码
服务器端:
WEB服务器端程序接收到“multipart/form-data”类型的
HTTP请求消息后,其核心和基本的编程工作就是读取请求消息中的实体内容,然后解析出每个分区的数据,接着再从每个分区中解析出描述头和主体内容部分。
要在jsp里获得上传的文件,就是通过request.getInputStream()来得到上传的整个post实体的流,用 request.getHeader("Content-Type")来取得实体内容的分界字符串,然后根据http协议,分析取得的上传的实体流,把文件部分给筛出来,然后在服务器端保存到磁盘文件中,另外因为上传文件时,form的属性enctype="multipart/form-data",所以其他表单参数在上传文件时也无法得到,除了筛出文件进行保存,还应该把其他的参数一起取出保存,以便在jsp程序中调用。
具体方法如下:
1、 根据request获得文件输入流;
2、 依次读取行,此时进行两部分内容的处理,
a:获取文件名
以 filename=”xxxxx”来标识一个文件头,
b:获取其他表单值(因为其流是按照multipart/form-data方式来编码的,所以在服务器端,不能直接用request.getParameter()来获得);
以name=”xxxx”来标识一个表单头
都以流头的字符标识为值的结束;
实体内容内部的字段分隔界线是在content-type头中指定的字段分隔界线前面增加了两个减号(-)字符而形成的(由浏览器随机生成,由浏览器 保证不会与用户上传的文件内容重复)
当找到一个分区的开始位置后,程序还需要分辨出分区中的描述头和主体内容,并对这两部分内容分开存储。如何分辨出一个分区的描述头和主体部分呢?每个分区中的描述头和主体内容之间有一空行,再加上描述头后面的换行,这就说明描述头和主体部分之间是使用“\n”、“\r”、“\n”、“\r”这四个连续的字节内容进行分隔。因此,程序需要把“\n”、“\r”、“\n”、“\r”这四个连续的字节内容作为描述头和主体部分之间的分隔界线,并在字节数组缓冲区buffer中寻找这个特殊的分隔界线来识别描述头和主体部分。
3、 根据读到的文件信息(文件名,文件大小等),判断是否合法(文件类型、文件大小判断)。如果合适则返回,如果不合适则创建同名文件并将其删除;
- http上传原理
- Http-----文件上传原理
- http上传文件的原理
- Http 文件上传原理解析
- 使用http 上传文件的原理
- 使用http 上传文件的原理
- 基于http协议的文件上传的原理
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (JAVA)http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- 从原理角度解析Android (Java) http 文件上传
- drop,delete和truncate的区别
- VS2008创建C++项目
- Ubuntu Navicat for MySQL安装以及破解方案
- 初始node.js
- Python使用struct处理二进制(pack和unpack用法)
- http上传原理
- 全面介绍Android Studio中Git的使用
- Android 利用sharepreference保存应用程序状态
- python chr()和ord()
- 全面介绍Android Studio中Git 的使用(二)
- 【JavaScript JSX ES6】阿拉伯数字日期和时间转中文大写
- 15. 冗余(2)
- java序列化 KRYO框架
- Android Studio工程项目减肥