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 事件查询综合
Jul 13 Javascript
浏览器加载、渲染和解析过程黑箱简析
Nov 29 Javascript
hover的用法及live的用法介绍(鼠标悬停效果)
Mar 29 Javascript
javascript实现密码强度显示
Mar 18 Javascript
JavaScript中的slice()方法使用详解
Jun 06 Javascript
javascript数组去重的六种方法汇总
Aug 16 Javascript
JavaScript使用Range调色及透明度实例
Sep 25 Javascript
微信小程序实现文字无限轮播效果
Dec 28 Javascript
通过微信公众平台获取公众号文章的方法示例
Dec 25 Javascript
原生JS实现留言板
Mar 26 Javascript
在vue中使用防抖函数组件操作
Jul 26 Javascript
vue实现在data里引入相对路径
Jun 05 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
php微信公众平台开发类实例
2015/04/01 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
2015/12/08 PHP
php中的explode()函数实例介绍
2019/01/18 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
详细总结Javascript中的焦点管理
2016/09/17 Javascript
Jquery获取radio选中的值
2017/05/05 jQuery
详解react、redux、react-redux之间的关系
2018/04/11 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
小程序实现点击tab切换左右滑动
2020/11/16 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
python文件操作之目录遍历实例分析
2015/05/20 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
如何使用Python多线程测试并发漏洞
2019/12/18 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
python函数超时自动退出的实操方法
2020/12/28 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
C#和SQL Server的面试题
2016/08/12 面试题
家长会学生家长演讲稿
2013/12/29 职场文书
运动会入场词50字
2014/02/20 职场文书
中药专业自荐信范文
2014/03/18 职场文书
合作意向书模板
2014/03/31 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
乡镇干部个人对照检查材料思想汇报
2014/10/04 职场文书
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
python画条形图的具体代码
2022/04/20 Python