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获取textarea中的光标位置
May 06 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
Aug 28 Javascript
JavaScript中使用自然对数ln的方法
Jun 14 Javascript
自定义Angular指令与jQuery实现的Bootstrap风格数据双向绑定的单选与多选下拉框
Dec 12 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
Jul 03 Javascript
如何基于js判断浏览器版本
Feb 20 Javascript
JavaScript find()方法及返回数据实例
Apr 30 Javascript
微信小程序开发打开另一个小程序的实现方法
May 17 Javascript
小程序中的箭头函数的具体使用
Jun 19 Javascript
分享8个JavaScript库可更好地处理本地存储
Oct 12 Javascript
JavaScript实现复选框全选功能
Apr 11 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制作静态网站的模板框架(三)
2006/10/09 PHP
PHP新手上路(二)
2006/10/09 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
2011/07/03 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
在win7中搭建Linux+PHP 开发环境
2014/10/08 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
记录一次websocket封装的过程
2020/11/23 Javascript
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python安装pil库方法及代码
2019/06/25 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
Python函数参数类型及排序原理总结
2019/12/19 Python
Python celery原理及运行流程解析
2020/06/13 Python
工程监理应届生求职信
2013/11/09 职场文书
美术专业个人自我评价
2014/01/18 职场文书
服务之星事迹材料
2014/05/03 职场文书
会计学专业自荐信
2014/06/25 职场文书
机关作风建设工作总结
2014/10/23 职场文书
2014年收银工作总结
2014/11/13 职场文书
2014年质检工作总结
2014/11/26 职场文书
军训个人总结
2015/03/03 职场文书
给老师的保证书怎么写
2015/05/09 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
CSS+HTML 实现顶部导航栏功能
2021/08/30 HTML / CSS