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 相关文章推荐
javascript cookie操作类的实现代码小结附使用方法
Jun 02 Javascript
JS获取后台Cookies值的小例子
Mar 04 Javascript
jquery live()调用不存在的解决方法
Feb 26 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
Aug 04 Javascript
jQuery实现带渐显效果的人物多级关系图代码
Oct 16 Javascript
js canvas实现擦除动画
Jul 16 Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 Javascript
javaScript实现滚动条事件详解
Mar 24 Javascript
vue的安装及element组件的安装方法
Mar 09 Javascript
Angular4.0动画操作实例详解
May 10 Javascript
vue使用recorder.js实现录音功能
Nov 22 Javascript
jquery插件懒加载的示例
Oct 24 jQuery
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
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
PHP数组array类常见操作示例
2020/05/15 PHP
javascript 日期时间 转换的方法
2013/02/21 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
Angular2使用Augury来调试Angular2程序
2017/05/21 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
VueRouter导航守卫用法详解
2017/12/25 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
javascript动态创建对象的属性详解
2018/11/07 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
原生js实现购物车功能
2020/09/23 Javascript
Python 学习笔记
2008/12/27 Python
pycharm 使用心得(一)安装和首次使用
2014/06/05 Python
Python的Django REST框架中的序列化及请求和返回
2016/04/11 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
Python中的 enum 模块源码详析
2019/01/09 Python
使用turtle绘制五角星、分形树
2019/10/06 Python
python绘制规则网络图形实例
2019/12/09 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
幼儿园国庆节活动方案
2014/02/01 职场文书
阿德的梦教学反思
2014/02/06 职场文书
客房领班岗位职责
2015/02/11 职场文书
贫困生证明范文
2015/06/16 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python