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 相关文章推荐
popdiv
Jul 14 Javascript
js动画(animate)简单引擎代码示例
Dec 04 Javascript
document.forms[].submit()使用介绍
Feb 19 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
Aug 05 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
jquery 一键复制到剪切板的实例
Sep 20 jQuery
karma+webpack搭建vue单元测试环境的方法示例
May 24 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
小程序云开发初探(小结)
Oct 24 Javascript
如何解决js函数防抖、节流出现的问题
Jun 17 Javascript
taro小程序添加骨架屏的实现代码
Nov 15 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
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
dojo 之基础篇(二)之从服务器读取数据
2007/03/24 Javascript
JsDom 编程小结
2011/08/09 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
2016/08/31 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
使用Webpack提高Vue.js应用的方式汇总(四种)
2017/07/10 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
解析Vue2 dist 目录下各个文件的区别
2017/11/22 Javascript
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
解决Echarts 显示隐藏后宽度高度变小的问题
2020/07/19 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
Vue-router编程式导航的两种实现代码
2021/03/04 Vue.js
Python3读取文件常用方法实例分析
2015/05/22 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python密码错误三次锁定(实例讲解)
2017/11/14 Python
python multiprocessing多进程变量共享与加锁的实现
2019/10/02 Python
Python搭建代理IP池实现获取IP的方法
2019/10/27 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
HomeAway澳大利亚:预订你的度假屋,公寓、度假村、别墅等
2019/02/20 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
阿里巴巴英国:Alibaba英国
2019/12/11 全球购物
Java里面有没有全局变量?为什么?
2015/02/06 面试题
自荐信结尾
2013/10/27 职场文书
小学教师岗位职责
2013/11/25 职场文书
主题实践活动总结
2014/05/08 职场文书
党的群众路线教育实践活动学习笔记
2014/11/05 职场文书
安全检查汇报材料
2014/12/26 职场文书
2015年工会工作总结
2015/03/30 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
Python3 类型标注支持操作
2021/06/02 Python
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python