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从头学起第二讲
Jul 04 Javascript
javascript代码运行不出来执行错误的可能情况整理
Oct 18 Javascript
js数组依据下标删除元素
Apr 14 Javascript
AngularJS基础知识笔记之过滤器
May 10 Javascript
Backbone.js的Hello World程序实例
Jun 19 Javascript
js实现滚动条滚动到页面底部继续加载
Dec 19 Javascript
JavaScript中的原始值和复杂值
Jan 07 Javascript
微信小程序 图片上传实例详解
May 05 Javascript
原生js实现移动端Touch轮播图的方法步骤
Jan 03 Javascript
你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)
Apr 15 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
Vue组件为什么data必须是一个函数
Jun 11 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 中的str_replace 函数总结
2007/04/27 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
深入浅析JavaScript中数据共享和数据传递
2016/04/25 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
webpack 打包压缩js和css的方法示例
2018/03/20 Javascript
webpack4与babel配合使es6代码可运行于低版本浏览器的方法
2018/10/12 Javascript
微信小程序实现复选框效果
2018/12/28 Javascript
详解React服务端渲染从入门到精通
2019/03/28 Javascript
详解VSCode配置启动Vue项目
2019/05/14 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python中split方法用法分析
2015/04/17 Python
Python中logging实例讲解
2019/01/17 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
python selenium循环登陆网站的实现
2019/11/04 Python
python列表生成器迭代器实例解析
2019/12/19 Python
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
华为俄罗斯官方网上商城:购买Huawei手机和平板
2017/04/21 全球购物
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
联强国际笔试题面试题
2013/07/10 面试题
最新销售员个人自荐信
2013/09/21 职场文书
篝火晚会主持词
2014/03/25 职场文书
周年庆典主持词
2014/04/02 职场文书
歌唱比赛策划方案
2014/06/06 职场文书
家长通知书家长意见
2015/06/03 职场文书