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 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
node.js中的fs.appendFileSync方法使用说明
Dec 17 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
Jan 13 Javascript
无刷新上传文件并返回自定义值
Jun 11 Javascript
js钢琴按钮波浪式图片排列效果代码分享
Aug 26 Javascript
prototype.js常用函数详解
Jun 18 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
Dec 27 Javascript
简述vue中的config配置
Jan 23 Javascript
es6新特性之 class 基本用法解析
May 05 Javascript
vue使用v-for实现hover点击效果
Sep 29 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
Feb 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php+javascript的日历控件
2009/11/19 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
隐性调用php程序的方法
2015/06/13 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
js的一些常用方法小结
2011/06/29 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
JavaScript动态修改网页元素内容的方法
2015/03/21 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
javascript十六进制及二进制转化的方法
2015/05/06 Javascript
js点击返回跳转到指定页面实现过程
2020/08/20 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
webpack结合express实现自动刷新的方法
2019/05/07 Javascript
JS实现移动端在线签协议功能
2019/08/22 Javascript
Javascript模块化机制实现原理详解
2020/04/02 Javascript
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
文职个人求职信范文
2013/09/23 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
测试工程师职业规划书
2014/02/06 职场文书
少年闰土教学反思
2014/02/22 职场文书
买房委托公证书
2014/04/08 职场文书
师德师风承诺书
2014/05/23 职场文书
归元寺导游词
2015/02/06 职场文书
保研导师推荐信
2015/03/25 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
上诉答辩状范文
2015/05/22 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js