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 相关文章推荐
ASP中进行HTML数据及JS数据编码函数
Nov 11 Javascript
基于jQuery的倒计时插件代码
May 07 Javascript
js中的布尔运算符使用介绍
Nov 20 Javascript
js实现俄罗斯方块小游戏分享
Jan 31 Javascript
jquery解析xml字符串示例分享
Mar 25 Javascript
JS对img标签进行优化使用onerror显示默认图像
Apr 24 Javascript
JavaScript中的this到底是什么(一)
Dec 09 Javascript
基于vue-cli创建的项目的目录结构及说明介绍
Nov 23 Javascript
Bootstrap Table实现定时刷新数据的方法
Aug 13 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
Aug 21 jQuery
详解TypeScript的基础类型
Feb 18 Javascript
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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自定义函数收代码
2010/08/01 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
php生成随机密码的几种方法
2011/01/17 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
PHP不使用内置函数实现字符串转整型的方法示例
2017/07/03 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
JavaScript使用HTML5的window.postMessage实现跨域通信例子
2014/04/11 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
javascript实现十秒钟后注册按钮可点击的方法
2015/05/13 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
2016/05/04 Javascript
jQuery复制节点用法示例(clone方法)
2016/09/08 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
原生js实现节日时间倒计时功能
2017/01/18 Javascript
详解Vue2 无限级分类(添加,删除,修改)
2017/03/07 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
webpack使用 babel-loader 转换 ES6代码示例
2017/08/21 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python3结合Dlib实现人脸识别和剪切
2018/01/24 Python
利用arcgis的python读取要素的X,Y方法
2018/12/22 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
python随机生成库faker库api实例详解
2019/11/28 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
python中spy++的使用超详细教程
2021/01/29 Python
2015大学生实训报告
2014/11/05 职场文书
校园开放日新闻稿
2015/07/17 职场文书