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 相关文章推荐
通过js获取div的background-image属性
Oct 15 Javascript
JS实现pasteHTML兼容ie,firefox,chrome的方法
Jun 22 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
js获取当前周、上一周、下一周日期
Mar 19 Javascript
vue使用drag与drop实现拖拽的示例代码
Sep 07 Javascript
Validform验证时可以为空否则按照指定格式验证
Oct 20 Javascript
canvas+gif.js打造自己的数字雨头像的示例代码
Oct 26 Javascript
React-Router如何进行页面权限管理的方法
Dec 06 Javascript
node.js博客项目开发手记
Mar 16 Javascript
jQuery - AJAX load() 实例用法详解
Aug 27 jQuery
Openlayers实现图形绘制
Sep 28 Javascript
Vue SPA 首屏优化方案
Feb 26 Vue.js
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/02/21 PHP
yii上传文件或图片实例
2014/04/01 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
php 生成加密公钥加密私钥实例详解
2017/06/16 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
AngularJS中如何使用$parse或$eval在运行时对Scope变量赋值
2016/01/25 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
vue 计时器组件的实现代码
2017/09/14 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
解析Python中的二进制位运算符
2015/05/13 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
PyQt5+requests实现车票查询工具
2019/01/21 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
铭万公司.net面试题笔试题
2014/07/20 面试题
Java基础类库面试题
2013/09/04 面试题
专营店会计助理岗位职责
2013/11/29 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
美术社团活动总结
2014/06/27 职场文书
食品安全汇报材料
2014/08/18 职场文书
党的群众路线教育实践活动对照检查材料思想汇报
2014/09/19 职场文书
2014年社区综治工作总结
2014/11/17 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
实习报告怎么写
2019/06/20 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
python中取整数的几种方法
2021/11/07 Python