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 相关文章推荐
js控制CSS样式属性语法对照表
Dec 11 Javascript
jQuery实现页面滚动时层智能浮动定位实例探讨
Mar 29 Javascript
jquery中$.post()方法的简单实例
Feb 04 Javascript
jQuery提示效果代码分享
Nov 20 Javascript
js实现的倒计时按钮实例
Jun 24 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
jQuery语法小结(超实用)
Dec 31 Javascript
微信小程序使用audio组件播放音乐功能示例【附源码下载】
Dec 08 Javascript
JavaScript实现单例模式实例分享
Dec 22 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
Apr 20 Javascript
d3.js实现自定义多y轴折线图的示例代码
May 30 Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 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动态实现表格跨行跨列实现代码
2012/11/06 PHP
PHP魔术方法__GET、__SET使用实例
2014/11/25 PHP
PHP学习笔记之php文件操作
2016/06/03 PHP
PHP第三方登录―QQ登录实现方法
2017/02/06 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
js鼠标滑过图片震动特效的方法
2015/02/17 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
JS实现简单省市二级联动
2019/11/27 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
Python多线程编程简单介绍
2015/04/13 Python
Python实现Linux命令xxd -i功能
2016/03/06 Python
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
tensorflow模型继续训练 fineturn实例
2020/01/21 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python 写一个性能测试工具(一)
2020/10/24 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
美国知名户外用品畅销中心:Sierra Trading Post
2016/07/19 全球购物
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
Ooni英国官网:披萨烤箱
2020/05/31 全球购物
北京华建集团SQL面试题
2014/06/03 面试题
4s店市场专员岗位职责
2014/04/09 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
北京颐和园导游词
2015/01/30 职场文书
个人年度总结报告
2015/03/09 职场文书