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 相关文章推荐
弹出层之1:JQuery.Boxy (一) 使用介绍
Oct 06 Javascript
javascript父子页面通讯实例详解
Jul 17 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
May 27 Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 Javascript
Vue 创建组件的两种方法小结(必看)
Feb 23 Javascript
VUE实现移动端列表筛选功能
Aug 23 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
May 27 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
Nov 12 Javascript
Vue实现tab导航栏并支持左右滑动功能
Jun 28 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程序中的常见漏洞进行攻击
2006/10/09 PHP
第八节--访问方式
2006/11/16 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP clearstatcache()函数详解
2010/03/02 PHP
php猜单词游戏
2015/09/29 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
2011/07/15 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
jquery序列化表单以及回调函数的使用示例
2014/07/02 Javascript
使用typeof判断function是否存在于上下文
2014/08/14 Javascript
纯javascript制作日历控件
2015/07/17 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
web页面和微信小程序页面实现瀑布流效果
2018/09/26 Javascript
vue项目打包后请求地址错误/打包后跨域操作
2020/11/04 Javascript
python实现在windows服务中新建进程的方法
2015/06/30 Python
python实现在控制台输入密码不显示的方法
2015/07/02 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
python3+PyQt5实现柱状图
2018/04/24 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
45个非常奇妙的CSS3 特性应用示例
2012/01/01 HTML / CSS
CSS3实现淘宝留白的方法
2020/06/05 HTML / CSS
一些.net面试题
2014/10/06 面试题
私有程序集与共享程序集有什么区别
2013/04/05 面试题
公司司机岗位职责范本
2014/03/03 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
微信搭讪开场白
2015/05/28 职场文书
pytorch 一行代码查看网络参数总量的实现
2021/05/12 Python
利用python Pandas实现批量拆分Excel与合并Excel
2021/05/23 Python