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 相关文章推荐
ExtJS Grid使用SimpleStore、多选框的方法
Nov 20 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
探讨js中的双感叹号判断
Nov 11 Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
Jul 05 Javascript
jquery实现仿新浪微博评论滚动效果
Aug 06 Javascript
js鼠标点击图片切换效果代码分享
Aug 26 Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 Javascript
jQuery 遍历map()方法详解
Nov 04 Javascript
JS敏感词过滤代码
Dec 23 Javascript
VueJs单页应用实现微信网页授权及微信分享功能示例
Jul 26 Javascript
ionic+html5+API实现双击返回键退出应用
Sep 17 Javascript
vue 设置 input 为不可以编辑的实现方法
Sep 19 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里的JS打印函数
2006/10/09 PHP
php字符串截取的简单方法
2013/07/04 PHP
PHP系统命令函数使用分析
2013/07/05 PHP
php检测useragent版本示例
2014/03/24 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
php实现计数器方法小结
2015/01/05 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
javascript 面向对象编程基础:封装
2009/08/21 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
setTimeout()与setInterval()方法区别介绍
2013/12/24 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
javascript实现瀑布流动态加载图片原理
2016/08/12 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
Angular.js中处理页面闪烁的方法详解
2017/03/09 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
jQuery扩展_动力节点Java学院整理
2017/07/05 jQuery
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
Vue.js devtool插件安装后无法使用的解决办法
2017/11/27 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
详解三种方式解决vue中v-html元素中标签样式
2018/11/22 Javascript
PowerBI和Python关于数据分析的对比
2019/07/11 Python
python3.7 的新特性详解
2019/07/25 Python
python中open函数的基本用法示例
2019/09/07 Python
Python实现直播推流效果
2019/11/26 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
python中类与对象之间的关系详解
2020/12/16 Python
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
生产总经理岗位职责
2013/12/19 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书