最近有需要完成 HTML 页面上传文件至 hdfs 的后台功能。
本文记述 HTTP 文件上传的基本原理和协议。
计划后续完成以下内容:
HTML 需要关心两点:
enctype
file
enctype 属性定义了 FORM 元素提交到服务器的内容的编码方式 ,参见w3说明。HTML 表单提供了三种编码 FORM 提交方式:
application/x-www-form-urlencoded
(default)multipart/form-data
text/plain
进行文件上传时(当 HTML 中包含有 <input type="file">
时),需要使用第二种 multipart/form-data
,更加适应于非 ASCII 文本类型文件(如二进制文件)的上传
参见 RFC ,基于表单的文件上传方式中为 input-type
添加了一个新的类型值 FILE
multipart/form-data
,指定后续内容间分隔符part boundaries
分隔"Content-Disposition" : "form-data"
标识
Content-Type
)filename
属性,指定控制名称 (control name)"Content-Transfer-Encoding"
设定内容编码方式对于同时上传多个文件情况,则在 multipart/form-data
中嵌入 multipart/mixed
,其内容与 multipart/form-data
一致,需要指定自己独特的分隔符字符串
使用如下静态页面:
<!DOCTYPE html4>
<html>
<head>
<title>upload test</title>
</head>
<body>
<form enctype="multipart/form-data"
method="post"
action="http://localhost:3001">
<p/><input type="text" name="Your name" value="larry"/>
<p/><input type="file" name="file-to-upload" filename="upload123.txt"/>
<p/><button type="submit">Submit</button>
</form>
</body>
</html>
上传文件,并使用 nc -l 3001
监听,用 wireshark 抓包结果如下图所示: