html web上传文件原理,Web上传文件的原理及实现
本文为原创,如需转载,请注明作者和出处,谢谢!
现在有很多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上传文件的原理及实现相关推荐
- 文件上传漏洞、WebShell、防御及绕过利用、Web容器解析漏洞、编辑器上传漏洞
文章目录 文件上传漏洞 漏洞概述 漏洞成因 漏洞危害 WebShell 大马 小马 GetShell 漏洞利用的条件 PUT方法上传文件 漏洞的防御.绕过和利用 黑白名单策略 安装upload-lab ...
- 第三十二天学习笔记-web漏洞-文件上传的条件竞争、.htaccess文件与.user.ini文件使用前提、二次渲染
目录 二次渲染原理 绕过方法 htaccess配置文件 .user.ini 二次渲染原理 在我们上传文件后,网站会对图片进行二次处理(格式.尺寸,保存,删除 要求等),服务器会把里面的内容进行替换更新 ...
- java图片上传下载_java web 文件上传与下载
组件工作流程:WEB服务器request ServletFil eupLoad DiskFileItem Factory代表普通字段的FileItem代表上传文件1FileItem代表上传文件2Fil ...
- java web 文件上传工具类_JavaWeb中实现文件上传的方式有哪些?
上回我们说了下文件下载的方式有哪些,这次我们从不同的环境下简单来说说文件上传的方式有哪些. 文件上传的方式Servlet2.5 方式 Servlet3.0 方式 SpringMVC 方式 案例实操 S ...
- WEB版一次选择多个文件进行批量上传(Plupload)的解决方案
说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 w ...
- 请将文件MP_verify_N8no8dpNO9n7wuBZ.txt上传至XXX指向的web服务器(或虚拟主机)的目录
1 环境 阿里云ECS服务器 2. 项目部署在tomcat下 问题: 在微信公众平台 填写 网页授权回调域名的时候 第三个 要求没通过 3.将文件MP_verify_N8no8dpNO9n7wu ...
- web安全入门(第七章-1)文件上传漏洞--解析、验证、伪造
一.客户端检测 1,客户端校验:一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单也有黑名单. 2,判断方式:通过抓包来判断,如果还未抓住包,就弹出不准上传,那么就是前端验证, ...
- php文件 用户头像上传代码,网页web上传用户头像代码实现(美图秀秀开放)
网页web上传用户头像代码实现(美图秀秀开放) 在制作论坛或者一些门户社交网站的时候,经常要获取用户的头像.之前我们一般都是自己制作flash插件头像上传.或者用js来自己开发一个头像上传功能.比如有 ...
- Java实现minio文件服务web在线解压上传工具类
前言 文章中的web解压工具类结合了minio文件服务,上传解压文件过程中,先解压成文件流,再将解压的文件又上传到minio文件服务器上.(不同本地文件服务,可以直接用文件copy的方式,cpoy到服 ...
最新文章
- linux 单个网卡配置多个IP
- Hadoop平台K-Means聚类算法分布式实现+MapReduce通俗讲解
- 4g模块注册上网 移远_通信模组企业 移远通信amp;广和通
- 西门子伺服电机选型手册_记,新入行维修电工大胆拆解伺服电机和编码器的经历...
- 吗 支持windows_M1能否原生支持Windows 苹果把问题抛给了微软
- 复制两个类的相同属性
- HTML5 CSS3编程入门经典 ((美)Rob Larsen) pdf扫描版
- Jar 包依赖冲突排查思路和解决方法(logback + slf4j-log4j12)
- html网页纯静态花店购物网站源码div+css页面将计30页,大学生毕业设计源码(源码下载)
- Mac 快捷键 桌面壁纸
- Qt调用工业相机之海康威视相机
- 活在当下,谋在未来,国内外新能源汽车城市物流配送运营模式创新
- OPPO设备设置第三方桌面为默认Launcher
- 古希腊数学家把数1,3,6,10,15,21,...叫做三角形数,它有一定的规律性。若把第一个三角形数记为a1,第二个三角形数记为a2,...,第n个三角形数记为an,计算a1+a2,a2+a3
- [阶段4 企业开发进阶] 8. Docker
- HTML+PHP搭建一个生物数据增删查改网站
- 多元微分学小结(4):隐函数存在定理的推广与函数相关
- 如何查看本机的ip地址和端口号
- tensorflow及keras安装(cpu版,python3.7版)
- 北航计算机学院本科优秀毕业论文,我校荣获32项北京市普通高等学校优秀本科生毕业设计(论文)...
热门文章
- 2022-2028年中国完全生物降解塑料产业发展动态及投资前景预测报告
- Go 学习笔记(65)— Go 中函数参数是传值还是传引用
- 字符串中匹配\n,\t 判读是否为nonetype类型
- 快速访问github镜像 wiki镜像重点_github问题小结
- CMOS图像传感器与DDI显示芯片
- 用小神经网络和光谱仪优化关键词识别
- TorchScript神经网络集成技术
- 2021年大数据HBase(三):HBase数据模型!!!【建议收藏】
- 2021年大数据Flink(四十四):​​​​​​扩展阅读 End-to-End Exactly-Once
- Cocos Creator里cc.tween的stopAllActions() 和 repeatForever的用法