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 相关文章推荐
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
javascript自执行函数之伪命名空间封装法
Dec 25 Javascript
jquery+ajax验证不通过也提交表单问题处理
Dec 12 Javascript
jQuery中:first选择器用法实例
Dec 30 Javascript
Vue 进阶教程之v-model详解
May 06 Javascript
jQuery实现动态控制页面元素的方法分析
Dec 20 jQuery
vue 系列——vue2-webpack2框架搭建踩坑之路
Dec 22 Javascript
vue全局组件与局部组件使用方法详解
Mar 29 Javascript
命令行批量截图Node脚本示例代码
Jan 25 Javascript
js正则匹配多个全部数据问题
Dec 20 Javascript
vue-cli3 取消eslint校验代码的解决办法
Jan 16 Javascript
js中实现继承的五种方法
Jan 25 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PHP strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
php实现每日签到功能
2018/11/29 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
js 解决“options为空或不是对象”
2008/12/22 Javascript
JS 去除Array中的null值示例代码
2013/11/20 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
javascript函数中参数传递问题示例探讨
2014/07/31 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
使用bootstrap插件实现模态框效果
2017/05/10 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能
2018/01/12 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
axios取消请求的实践记录分享
2018/09/26 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
JS随机密码生成算法
2019/09/23 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
Vue学习之常用指令实例详解
2020/01/06 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
[01:33:30]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第二场 2月5日
2021/03/11 DOTA
Python中的pprint折腾记
2015/01/21 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
丝绸和人造花卉、植物和树木:Nearly Natural
2018/11/28 全球购物
采购内勤岗位职责
2013/12/10 职场文书
服装采购员岗位职责
2014/03/15 职场文书
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python