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 相关文章推荐
popdiv
Jul 14 Javascript
prototype 学习笔记整理
Jul 17 Javascript
javascript的函数、创建对象、封装、属性和方法、继承
Mar 10 Javascript
jQuery图片轮播的具体实现
Sep 11 Javascript
Javascript基础教程之数据类型转换
Jan 18 Javascript
js编写贪吃蛇的小游戏
Aug 24 Javascript
移动端web滚动分页的实现方法
May 05 Javascript
Javascript继承机制详解
May 30 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
使用Vue制作图片轮播组件思路详解
Mar 21 Javascript
JavaScript防止全局变量污染的方法总结
Aug 02 Javascript
详解es6新增数组方法简便了哪些操作
May 09 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中设置时区,记录日志文件的实现代码
2013/01/07 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
PHP随机生成唯一HASH值自定义函数
2015/04/20 PHP
PHP的关于变量和日期处理的一些面试题目整理
2015/08/10 PHP
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
javascript showModalDialog,open取得父窗口的方法
2010/03/10 Javascript
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
2011/10/29 Javascript
java与javascript之间json格式数据互转介绍
2013/10/29 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
jQuery Validate验证框架经典大全
2015/09/23 Javascript
JS变量及其作用域
2017/03/29 Javascript
基于js 各种排序方法和sort方法的区别(详解)
2018/01/03 Javascript
微信小程序switch组件使用详解
2018/01/31 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
jquery实现手风琴案例
2020/05/04 jQuery
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
Python实现的监测服务器硬盘使用率脚本分享
2014/11/07 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
python将dict中的unicode打印成中文实例
2020/05/11 Python
Python中有几个关键字
2020/06/04 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
摩托车和ATV零件、配件和服装的首选在线零售商:MotoSport
2017/12/22 全球购物
印度尼西亚最完整和最大的在线药房网站:Farmaku.com
2019/11/23 全球购物
What is EJB
2016/07/22 面试题
Unix如何添加新的用户
2014/08/20 面试题
创联软件面试题笔试题
2012/10/07 面试题
实习老师个人总结的自我评价
2013/09/28 职场文书
工程资料员岗位职责
2014/03/10 职场文书
我的理想演讲稿
2014/04/30 职场文书
2014保险公司内勤工作总结
2014/12/16 职场文书
2019个人工作自我评价范文(3篇)
2019/09/19 职场文书