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、 根据读到的文件信息(文件名,文件大小等),判断是否合法(文件类型、文件大小判断)。如果合适则返回,如果不合适则创建同名文件并将其删除;

0 0
原创粉丝点击