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 30 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
JS设计模式之单例模式(一)
Sep 29 Javascript
详解React中setState回调函数
Jun 14 Javascript
vue.js实现带日期星期的数字时钟功能示例
Aug 28 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
vue与原生app的对接交互的方法(混合开发)
Nov 28 Javascript
JS算法题之查找数字在数组中的索引位置
May 15 Javascript
Vue v-text指令简单使用方法示例
Sep 19 Javascript
JavaScript中的各种宽高属性的实现
May 08 Javascript
vue使用Sass时报错问题的解决方法
Oct 14 Javascript
Vue实现点击当前行变色
Dec 14 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数据导出知识点
2018/02/17 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
百度地图api应用标注地理位置信息(js版)
2013/02/01 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
使用CSS3的scale实现网页整体缩放
2014/03/18 Javascript
js写出遮罩层登陆框和对联广告并自动跟随滚动条滚动
2014/04/29 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
详解JavaScript ES6中的Generator
2015/07/28 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
2016/06/13 Javascript
js获取Get值的方法
2016/09/29 Javascript
jQuery事件用法详解
2016/10/06 Javascript
jquery单击文字或图片内容放大并居中显示
2017/06/23 jQuery
vue中$nextTick的用法讲解
2019/01/17 Javascript
Vue事件处理原理及过程详解
2020/03/11 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
2020/08/06 Javascript
在Python程序中操作文件之flush()方法的使用教程
2015/05/24 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
python 接口_从协议到抽象基类详解
2017/08/24 Python
pip命令无法使用的解决方法
2018/06/12 Python
Python基于datetime或time模块分别获取当前时间戳的方法实例
2019/02/19 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
CSS3 :nth-child()伪类选择器实现奇偶行显示不同样式
2013/11/05 HTML / CSS
HEMA法国:荷兰原创设计
2019/02/21 全球购物
Nike加拿大官网:Nike.com (CA)
2019/04/09 全球购物
教师演讲稿大全
2014/05/16 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript
springboot集成redis存对象乱码的问题及解决
2022/06/16 Java/Android
java实现web实时消息推送的七种方案
2022/07/23 Java/Android