Node.js模拟浏览器文件上传示例


Posted in Javascript onMarch 26, 2014

OSChina上发过了,那个也是我的,现在放到这来,哈哈

这段代码只能一次上传一个文件~~

var path=require("path"); 
var fs=require("fs"); 
var http=require("http"); //post值payload 
var getfield=function(field, value) { 
return 'Content-Disposition: form-data; name="'+field+'"\r\n\r\n'+value+'\r\n'; 
} 
//文件payload 
var getfieldHead=function (field, filename) { 
var fileFieldHead='Content-Disposition: form-data; name="'+field+'"; filename="'+filename+'"\r\n'+'Content-Type: '+getMime(filename)+'\r\n\r\n'; 
return fileFieldHead; 
} 
//获取Mime 
var getMime=function (filename) { 
var mimes = { 
'.png': 'image/png', 
'.gif': 'image/gif', 
'.jpg': 'image/jpeg', 
'.jpeg': 'image/jpeg', 
'.js': 'appliction/json', 
'.torrent': 'application/octet-stream' 
}; 
var ext = path.extname(filename); 
var mime = mimes[ext]; 
mime=!!mime?mime:'application/octet-stream'; 
return mime; 
} 
//获取边界检查随机串 
var getBoundary=function() { 
var max = 9007199254740992; 
var dec = Math.random() * max; 
var hex = dec.toString(36); 
var boundary = hex; 
return boundary; 
} 
//获取boundary 
var getBoundaryBorder=function (boundary) { 
return '--'+boundary+'\r\n'; 
} 
//字段格式化 
function fieldPayload(opts) { 
var payload=[]; 
for(var id in opts.field){ 
payload.push(getfield(id,opts.field[id])); 
} 
payload.push(""); 
return payload.join(getBoundaryBorder(opts.boundary)); 
} 
//post数据 
function postRequest (opts) { 
filereadstream(opts,function (buffer) { 
var options=require('url').parse(opts.url); 
var Header={}; 
var h=getBoundaryBorder(opts.boundary); 
var e=fieldPayload(opts); 
var a=getfieldHead(opts.param,opts.file); 
var d="\r\n"+h; 
Header["Content-Length"]=Buffer.byteLength(h+e+a+d)+buffer.length; 
Header["Content-Type"]='multipart/form-data; boundary='+opts.boundary; 
options.headers=Header; 
options.method='POST'; 
var req=http.request(options,function(res){ 
var data=''; 
res.on('data', function (chunk) { 
data+=chunk; 
}); 
res.on('end', function () { 
console.log(res.statusCode) 
console.log(data); 
}); 
}); 
req.write(h+e+a);log.diy(h+e+a+buffer+d); 
req.write(buffer); 
req.end(d); 
}); 
} 
//读取文件 
function filereadstream(opts, fn) { 
var readstream = fs.createReadStream(opts.file,{flags:'r',encoding:null}); 
var chunks=[]; 
var length = 0; 
readstream.on('data', function(chunk) { 
length += chunk.length; 
chunks.push(chunk); 
}); 
readstream.on('end', function() { 
var buffer = new Buffer(length); 
for(var i = 0, pos = 0, size = chunks.length; i < size; i++) { 
chunks[i].copy(buffer, pos); 
pos += chunks[i].length; 
} 
fn(buffer); 
}); 
} 
//各类设置 
var opt={ 
"url":"http://xxxx.xx",//url 
"file":"00.jpg",//文件位置 
"param":"file",//文件上传字段名 
"field":{//其余post字段 
"client":"1", 
"title":"ok" 
}, 
"boundary":"----WebKitFormBoundary"+getBoundary() 
} 
postRequest(opt); 
/* 
------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n 
Content-Disposition: form-data; name="file"; filename="00.jpg"\r\n 
Content-Type: application/octet-stream 
\r\n 
\r\n +file\r\n 
------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n 
Content-Disposition: form-data; name="fieldName" 
\r\n 
\r\n +value\r\n 
------WebKitFormBoundaryuzKmkAovUuYsQ1Dt-- 
*/

最后这个注释的是标准格式“\r\n”代表实际的字符串,为了看着舒服,视觉上也调整一下
Javascript 相关文章推荐
jQuery简易图片放大特效示例代码
Jun 09 Javascript
jquery中post方法用法实例
Oct 21 Javascript
readonly和disabled属性的区别
Jul 26 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
基于jQuery实现自动轮播旋转木马特效
Nov 02 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
原生JS获取元素集合的子元素宽度实例
Dec 14 Javascript
Angular中使用$watch监听object属性值的变化(详解)
Apr 24 Javascript
详解Angular5路由传值方式及其相关问题
Apr 28 Javascript
vue项目base64字符串转图片的实现代码
Jul 13 Javascript
Javascript实现html转pdf高清版(提高分辨率)
Feb 19 Javascript
JS实现网页时钟特效
Mar 25 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
Mar 26 #Javascript
JavaScript数字和字符串转换示例
Mar 26 #Javascript
jquery实现瀑布流效果分享
Mar 26 #Javascript
jquery实现效果比较好的table选中行颜色
Mar 25 #Javascript
Jquery对数组的操作技巧整理
Mar 25 #Javascript
常用的几段javascript代码分享
Mar 25 #Javascript
捕获和分析JavaScript Error的方法
Mar 25 #Javascript
You might like
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
js html css实现复选框全选与反选
2016/10/09 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
uni-app实现点赞评论功能
2019/11/25 Javascript
three.js 制作动态二维码的示例代码
2020/07/31 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python多线程、异步+多进程爬虫实现代码
2016/02/17 Python
在python中用url_for构造URL的方法
2019/07/25 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
python获取响应某个字段值的3种实现方法
2020/04/30 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
python如何实现图片压缩
2020/09/11 Python
Vilebrequin欧洲官网:法国豪华泳装品牌(男士沙滩裤)
2018/04/14 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
舞会礼服和舞会鞋:PromGirl
2019/04/22 全球购物
Kingsoft金山公司C/C++笔试题
2016/05/10 面试题
师范学院教师自荐书
2014/01/31 职场文书
小露珠教学反思
2014/04/30 职场文书
音乐教师求职信
2014/06/28 职场文书
先进员工事迹材料
2014/12/20 职场文书
小班下学期幼儿评语
2014/12/30 职场文书