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文件缓存之版本管理详解
Jul 05 Javascript
禁用Enter键表单自动提交实现代码
May 22 Javascript
js图片实时加载提供网页打开速度
Sep 11 Javascript
js设置和获取自定义属性的方法
Oct 20 Javascript
JS中微信小程序自定义底部弹出框
Dec 22 Javascript
微信小程序开发animation心跳动画效果
Aug 16 Javascript
微信web端后退强制刷新功能的实现代码
Mar 04 Javascript
基于VUE实现的九宫格抽奖功能
Sep 30 Javascript
小程序登录/注册页面设计的实现代码
May 24 Javascript
基于vue实现圆形菜单栏组件
Jul 05 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
Sep 16 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
php的一个登录的类 [推荐]
2007/03/16 PHP
php中动态变量用法实例
2015/06/10 PHP
php实现购物车功能(下)
2016/01/05 PHP
php session的锁和并发
2016/01/22 PHP
PHP排序算法之基数排序(Radix Sort)实例详解
2018/04/21 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
PHP中Session ID的实现原理实例分析
2019/08/17 PHP
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
JS定时器实例
2013/04/17 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
2014/09/03 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
Vue使用.sync 实现父子组件的双向绑定数据问题
2019/04/04 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
简单谈谈Python中函数的可变参数
2016/09/02 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
简单介绍python封装的基本知识
2019/08/10 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
python反爬虫方法的优缺点分析
2020/11/25 Python
pycharm 实现复制一行的快捷键
2021/01/15 Python
python自动化办公操作PPT的实现
2021/02/05 Python
详解px单位html5响应式方案
2018/03/08 HTML / CSS
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
台湾7-ELEVEN线上购物中心:7-11
2021/01/21 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
环境工程求职简历的自我评价范文
2013/10/24 职场文书
经典演讲稿范文
2013/12/30 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
个人违纪检讨书
2014/09/15 职场文书
爱国主义电影观后感
2015/06/18 职场文书
一篇文章搞懂python混乱的切换操作与优雅的推导式
2021/08/23 Python
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis