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 相关文章推荐
在firefox和Chrome下关闭浏览器窗口无效的解决方法
Jan 16 Javascript
jquery validate.js表单验证入门实例(附源码)
Nov 10 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
第一篇初识bootstrap
Jun 21 Javascript
详解Layer弹出层样式
Aug 21 Javascript
移动web开发之touch事件实例详解
Jan 17 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
Dec 03 Javascript
vue element中axios下载文件(后端Python)
May 10 Javascript
turn.js异步加载实现翻书效果
Jul 25 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
vue中用 async/await 来处理异步操作
Jul 18 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 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
克隆一个新项目的快捷方式
2013/04/10 PHP
php curl_init函数用法
2014/01/31 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
php防止CC攻击代码 php防止网页频繁刷新
2015/12/21 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
JQUERY THICKBOX弹出层插件
2008/08/30 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
jquery获取节点名称
2015/04/26 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
2018/01/12 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
使用Python3 编写简单信用卡管理程序
2016/12/21 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
详解python配置虚拟环境
2019/04/08 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
纯css3实现照片墙效果
2014/12/26 HTML / CSS
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
Java如何格式化日期
2012/08/07 面试题
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
员工合理化建议书
2014/05/19 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书