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 相关文章推荐
Jquery 弹出层插件实现代码
Oct 24 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
Dec 12 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
Jan 24 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
Oct 24 Javascript
原始XMLHttpRequest方法详情回顾
Nov 28 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
Dec 17 Javascript
javascript对浅拷贝和深拷贝的详解
Oct 14 Javascript
JavaScript自定义文本框光标
Mar 05 Javascript
vue router 用户登陆功能的实例代码
Apr 24 Javascript
原生JS实现留言板
Mar 26 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
Dec 01 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 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
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
Yii2框架实现登陆添加验证码功能示例
2018/07/12 PHP
脚本安需导入(装载)的三种模式的对比
2007/06/24 Javascript
关于 byval 与 byref 的区别分析总结
2007/10/08 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
vue按需加载组件webpack require.ensure的方法
2017/12/13 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
2018/09/16 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
2020/07/20 Javascript
Python中用format函数格式化字符串的用法
2015/04/08 Python
使用Python编写提取日志中的中文的脚本的方法
2015/04/30 Python
Django实现快速分页的方法实例
2017/10/22 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
2019/07/22 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
解决virtualenv -p python3 venv报错的问题
2021/02/05 Python
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
大学生新闻专业个人自我评价
2013/11/12 职场文书
洗煤厂厂长岗位职责
2014/01/03 职场文书
就业表自我评价分享
2014/02/06 职场文书
《小儿垂钓》教学反思
2014/02/23 职场文书
德育标兵事迹材料
2014/08/24 职场文书
重点工程汇报材料
2014/08/27 职场文书
eval(cmd)与eval($cmd)的区别与联系
2021/07/07 PHP
讲解MySQL增删改操作
2022/05/06 MySQL