Http协议文件的上传与下载
浏览器是如何上传文件的?
网页端,其中mp3Blob为html5新特性中的二进制对象,FormData可以理解成一个虚拟的表单对象:
var mFormData = new FormData();
mFormData.append('Voice', mp3Blob);
mFormData.append('State', "嗨啊");
$.ajax({
url: "/PostMessage",
type: "post",
data: mFormData,
processData: false,
contentType: false,
success: function(data) {}
});
含有文件信息的http头请求如下:
{ host: '127.0.0.1:6324',
connection: 'keep-alive',
'content-length': '131386',
accept: '*/*',
origin: 'http://127.0.0.1:6324',
'x-requested-with': 'XMLHttpRequest',
'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
'content-type': 'multipart/form-data; boundary=----WebKitFormBoundarySWrbL4OY8FnqqYUF',
referer: 'http://127.0.0.1:6324/main',
'accept-encoding': 'gzip, deflate',
'accept-language': 'zh-CN,zh;q=0.8' }
服务器是如何接受文件的?
如果是手动解析的话,需要根据请求中的头部获取boundary,再根据boundary来进行字符串切块,再分块处理,过于繁琐,但又不想引入express框架,于是用了formidable这个模块,用于浏览器提交的表单处理。
//创建表单上传
var form = new formidable.IncomingForm();
//设置编辑
form.encoding = 'utf-8';
//设置文件存储路径
form.uploadDir = Config['RootPath'];
//保留后缀
form.keepExtensions = true;
//设置单文件大小限制
form.maxFieldsSize = 2 * 1024 * 1024;
//form.maxFields = 1000; 设置所以文件的大小总和
form.parse(Request, function(err, fields, files) {
});