文件上传原理实现
客户端浏览器是怎样上传数据的呢?服务器端如何接收上传的文件数据?
级别: 初级
2004 年 9 月 01 日
文章主要描述http表单上传二进制数据流规范的简单实现
(一)关于Form表单上传文件规范
总结个人在对新技术、新事物的学习和解决问题的过程,深刻体会到多理解掌握技术基础理论知识再加上相应的实践,的确能帮助我们在解决某些问题的时候起到事半功倍的效果。
以前上传文件类似的功能都是采用第三方组件来做的,真的是基于接口编程了。不出问题还好,真要是出现问题解决起来太不舒服了,往往属于那种拆了西墙补东墙的策略。最近,在做文件上传时学习了一些 关于html>form上传数据的格式规范,依据人家定义的规范做了一些简单的工作。。。算是实现了个小轮子吧。
(二)实现
-
1、规则
- 1.1 上传数据块的分割规则
- 1.2 注意在后台从request中取得分割串少两个 --,在看下面的原始数据你会发现流的最后是以 --结束的。
- 1.3 上传的原始数据串,本来中文字符是乱码的。为了清晰一些使用字符集UTF-8转了下码。
- 1.4 小结
基于html form表单上传的数据都是以类似-----------------------------7da3c8e180752{0x130x10}这样的分割符来标记一块数据的起止,可不要忘记后面的两个换行符。关于换行符有三种,如下:
操作系统 | 换行符描述 | 原始标记 | ascii码 | 十六进制 |
Window | Window的换行符是两个 | //r//n | 1310 | 0x0d0x0a |
Unix | Unix的换行符是一个 | //n | 10 | 0x0a |
Mac OS | Mac OS的换行符是一个 | //r | 13 | 0x0d |
这块没有对Unix、MacOS上做测试,只在Window上测试了换行是两个(0x0d0x0a) |
基于1.3小节可以非常容易总结归纳出html-->form元素内容。有两个文件类型元素,三个text元素(其中一个元素是textarea)
2、操作顺序流程描述

![]() ![]() |
![]()
|
3、实现代码
需要明确注意的一个问题是关于request.getInputStream();获取请求体数据流不可用的问题,见示例代码:
3.1、类图

3.2、代码内容
(三)资源