本文为原创,如需转载,请注明作者和出处,谢谢!

现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons

FileUpload、还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2在底层也使用了Commons FileUpload)。在asp.net中也有相应的上传文件的控件。

虽然现在有很多上传组件可以利用,但是了解Web上传文件的原理,对于处理突然出现的问题会有很大的帮助,下面就来讲一下通过浏览器上传文件的基本原理。在了解了原理之后,就可以非常容易地自制满足自身需要的上传组件了。

众所周知,在客户端代码中需要使用

name='file' />来选择要上传的文件,并上传,代码如上:

upload

从上面的代码可以看出,有两个文件选择框(file1和file2),在上传文件时,

标签必须加上enctype="multipart/form-data",否则浏览器无法将文件内容上传到服务端。下面我们来做个实验。在Servlet的doPost方法中编写如下的代码,如果想使用asp.net或其他的语言或技术,也可以很容易实现相应的功能。

publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException

{

java.io.InputStream is=request.getInputStream();

java.io.FileOutputStream fos=newjava.io.FileOutputStream("d:\\out.txt");byte[] buffer=newbyte[8192];intcount=0;while((count=is.read(buffer))>0)

{

fos.write(buffer,0, count);

}

fos.close();

}

上面的功能非常简单,只是通过request获得一个InputStream对象,并通过这个对象从客户端获得发送过来的字节流(注意,一定要用字节流,因为,上传的文件可能是二进制文件,如图象文件,因此,使用字节流会更通用)。并将这些字节流保存在D盘的out.txt文件中。然后我们打开out.txt,文件的内容如图1所示:

图1

由于out.txt是使用文本形式打开的,并且file1上传的是a.jpg(一个图象文件),因此,显示的是一些乱码。我们可以不用管它们。只需要看看这些内容的头部。我们很快就可以找到规律。每一个文件内容的头部都由“-----------------------------30514443229777”分隔,然后是这个文件的属性,如下:Content-Disposition: form-data; name="file1";

filename="a.jpg"

Content-Type: image/jpeg

其中包含了文件选择框的name属性,还有上传的文件名(filename字段),要注意的,firefox在上传时,这个filename属性值只是文件名,如果使用IE,就是带路径的文件名,如D:"a.jpg。

接下来的规则就和HTTP的头一样了,以一个空行("r"n)分隔。后面就是文件的具体内容。现在最关键的文件的结尾,从图1可以看出,文件的结尾也是“-----------------------------30514443229777”,因此,可以断定,第一个上传的文件(包括文件头)是夹在两个“-----------------------------30514443229777”之间的。而“-----------------------------30514443229777”就是multipart/form-data协议的分隔符。但这里还有一个最关键的问题。这个分隔符每次上传都不一样,服务端是如何知道每次上传的这个分隔符的呢?

实际上,这个分隔符是通过HTTP请求头的Content-Type字段获得,可通过下面的代码输出这个字段值:System.out.println(request.getHeader("Content-type"));

输出的内容如下:multipart/form-data; boundary=---------------------------106712230227687

只要在服务端获得boundary后面的值即可。经过测试,Content-Type中的分隔符号中的“-”比实际上传的“-”少两个,不知是怎么回事。不过这没关系,我们可以认为每一个文件块是以""r"n—“结尾的,或是直接将从boundary获得的分隔符加两个“—”。而最后结尾的分隔符是“---------------------------106712230227687—”,后面多了两个“—”。

综合上述,也就是说,一个文件块是以“---------------------------106712230227687”开头,以“—”结尾,从图2可以看出这一切。

图2

至于剩下的工作,就是按着上面的规则来分析这些字符流了。分析的方法很多。在这里就不详述了。multipart/form-data

html web上传文件原理,Web上传文件的原理及实现相关推荐

  1. 文件上传漏洞、WebShell、防御及绕过利用、Web容器解析漏洞、编辑器上传漏洞

    文章目录 文件上传漏洞 漏洞概述 漏洞成因 漏洞危害 WebShell 大马 小马 GetShell 漏洞利用的条件 PUT方法上传文件 漏洞的防御.绕过和利用 黑白名单策略 安装upload-lab ...

  2. 第三十二天学习笔记-web漏洞-文件上传的条件竞争、.htaccess文件与.user.ini文件使用前提、二次渲染

    目录 二次渲染原理 绕过方法 htaccess配置文件 .user.ini 二次渲染原理 在我们上传文件后,网站会对图片进行二次处理(格式.尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新 ...

  3. java图片上传下载_java web 文件上传与下载

    组件工作流程:WEB服务器request ServletFil eupLoad DiskFileItem Factory代表普通字段的FileItem代表上传文件1FileItem代表上传文件2Fil ...

  4. java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?

    上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...

  5. WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

    说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 w ...

  6. 请将文件MP_verify_N8no8dpNO9n7wuBZ.txt上传至XXX指向的web服务器(或虚拟主机)的目录

    1  环境  阿里云ECS服务器 2. 项目部署在tomcat下 问题: 在微信公众平台 填写 网页授权回调域名的时候  第三个 要求没通过 3.将文件MP_verify_N8no8dpNO9n7wu ...

  7. web安全入门(第七章-1)文件上传漏洞--解析、验证、伪造

    一.客户端检测 1,客户端校验:一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单也有黑名单. 2,判断方式:通过抓包来判断,如果还未抓住包,就弹出不准上传,那么就是前端验证, ...

  8. php文件 用户头像上传代码,网页web上传用户头像代码实现(美图秀秀开放)

    网页web上传用户头像代码实现(美图秀秀开放) 在制作论坛或者一些门户社交网站的时候,经常要获取用户的头像.之前我们一般都是自己制作flash插件头像上传.或者用js来自己开发一个头像上传功能.比如有 ...

  9. Java实现minio文件服务web在线解压上传工具类

    前言 文章中的web解压工具类结合了minio文件服务,上传解压文件过程中,先解压成文件流,再将解压的文件又上传到minio文件服务器上.(不同本地文件服务,可以直接用文件copy的方式,cpoy到服 ...

最新文章

  1. linux 单个网卡配置多个IP
  2. Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解
  3. 4g模块注册上网 移远_通信模组企业 移远通信amp;广和通
  4. 西门子伺服电机选型手册_记,新入行维修电工大胆拆解伺服电机和编码器的经历...
  5. 吗 支持windows_M1能否原生支持Windows 苹果把问题抛给了微软
  6. 复制两个类的相同属性
  7. HTML5 CSS3编程入门经典 ((美)Rob Larsen) pdf扫描版
  8. Jar 包依赖冲突排查思路和解决方法(logback + slf4j-log4j12)
  9. html网页纯静态花店购物网站源码div+css页面将计30页,大学生毕业设计源码(源码下载)
  10. Mac 快捷键 桌面壁纸
  11. Qt调用工业相机之海康威视相机
  12. 活在当下,谋在未来,国内外新能源汽车城市物流配送运营模式创新
  13. OPPO设备设置第三方桌面为默认Launcher
  14. 古希腊数学家把数1,3,6,10,15,21,...叫做三角形数,它有一定的规律性。若把第一个三角形数记为a1,第二个三角形数记为a2,...,第n个三角形数记为an,计算a1+a2,a2+a3
  15. [阶段4 企业开发进阶] 8. Docker
  16. HTML+PHP搭建一个生物数据增删查改网站
  17. 多元微分学小结(4):隐函数存在定理的推广与函数相关
  18. 如何查看本机的ip地址和端口号
  19. tensorflow及keras安装(cpu版,python3.7版)
  20. 北航计算机学院本科优秀毕业论文,我校荣获32项北京市普通高等学校优秀本科生毕业设计(论文)...

热门文章

  1. 2022-2028年中国完全生物降解塑料产业发展动态及投资前景预测报告
  2. Go 学习笔记(65)— Go 中函数参数是传值还是传引用
  3. 字符串中匹配\n,\t 判读是否为nonetype类型
  4. 快速访问github镜像 wiki镜像重点_github问题小结
  5. CMOS图像传感器与DDI显示芯片
  6. 用小神经网络和光谱仪优化关键词识别
  7. TorchScript神经网络集成技术
  8. 2021年大数据HBase(三):HBase数据模型!!!【建议收藏】
  9. 2021年大数据Flink(四十四):​​​​​​扩展阅读 End-to-End Exactly-Once
  10. Cocos Creator里cc.tween的stopAllActions() 和 repeatForever的用法