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 XMLHttpRequest对象全面剖析
Apr 24 Javascript
Javascript 倒计时源代码.(时.分.秒) 详细注释版
May 09 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
JavaScript cookie的设置获取删除详解
Feb 11 Javascript
iframe实用操作锦集
Apr 22 Javascript
Javascript优化技巧之短路表达式详细介绍
Mar 27 Javascript
JQuery实现图片轮播效果
May 08 jQuery
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
May 22 Javascript
vue.js系列中的vue-fontawesome使用
Feb 10 Javascript
详解React之key的使用和实践
Sep 29 Javascript
如何在微信小程序中实现Mixins方案
Jun 20 Javascript
react如何快速设置文件路径别名
Apr 28 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
一个更简单的无限级分类菜单代码
2007/01/16 PHP
php 修改、增加xml结点属性的实现代码
2013/10/22 PHP
详解在YII2框架中使用UEditor编辑器发布文章
2018/11/02 PHP
js 操作select相关方法函数
2009/12/06 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
2011/12/26 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
JS实现小星星特效
2019/12/24 Javascript
es6中new.target的作用和使用场景简单示例分析
2020/03/14 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
python操作mongodb根据_id查询数据的实现方法
2015/05/20 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
用python3 返回鼠标位置的实现方法(带界面)
2019/07/05 Python
Django中URL的参数传递的实现
2019/08/04 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
Python 实现平台类游戏添加跳跃功能
2020/03/27 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
大学生个人求职信范文
2013/09/21 职场文书
法律进机关实施方案
2014/03/12 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
志愿者事迹材料
2014/12/26 职场文书
长城的导游词
2015/01/30 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
分析Python感知线程状态的解决方案之Event与信号量
2021/06/16 Python
MySQL中order by的执行过程
2022/06/05 MySQL
Python使用pyecharts控件绘制图表
2022/06/05 Python