Node.js模拟浏览器文件上传

转自http://blog.csdn.net/jimmyvip/article/details/22084471



[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var path=require("path");  
  2. var fs=require("fs");  
  3. var http=require("http");  
  4.   
  5. //post值payload  
  6. var getfield=function(field, value) {  
  7.     return 'Content-Disposition: form-data; name="'+field+'"\r\n\r\n'+value+'\r\n';  
  8. }  
  9.   
  10. //文件payload  
  11. var getfieldHead=function (field, filename) {  
  12.     var fileFieldHead='Content-Disposition: form-data; name="'+field+'"; filename="'+filename+'"\r\n'+'Content-Type: '+getMime(filename)+'\r\n\r\n';  
  13.     return fileFieldHead;  
  14. }  
  15. //获取Mime  
  16. var getMime=function (filename) {  
  17.     var mimes = {  
  18.         '.png''image/png',  
  19.         '.gif''image/gif',  
  20.         '.jpg''image/jpeg',  
  21.         '.jpeg''image/jpeg',  
  22.         '.js''appliction/json',  
  23.         '.torrent''application/octet-stream'  
  24.     };  
  25.     var ext = path.extname(filename);  
  26.     var mime = mimes[ext];  
  27.     mime=!!mime?mime:'application/octet-stream';  
  28.     return mime;  
  29. }  
  30. //获取边界检查随机串  
  31. var getBoundary=function() {  
  32.     var max = 9007199254740992;  
  33.     var dec = Math.random() * max;  
  34.     var hex = dec.toString(36);  
  35.     var boundary = hex;  
  36.     return boundary;  
  37. }  
  38. //获取boundary  
  39. var getBoundaryBorder=function (boundary) {  
  40.     return '--'+boundary+'\r\n';  
  41. }  
  42. //字段格式化  
  43. function fieldPayload(opts) {  
  44.     var payload=[];  
  45.     for(var id in opts.field){  
  46.         payload.push(getfield(id,opts.field[id]));  
  47.     }  
  48.     payload.push("");  
  49.     return payload.join(getBoundaryBorder(opts.boundary));  
  50. }  
  51.   
  52. //post数据  
  53. function postRequest (opts) {  
  54.     filereadstream(opts,function (buffer) {  
  55.         var options=require('url').parse(opts.url);  
  56.         var Header={};  
  57.         var h=getBoundaryBorder(opts.boundary);  
  58.         var e=fieldPayload(opts);  
  59.         var a=getfieldHead(opts.param,opts.file);  
  60.         var d="\r\n"+h;  
  61.         Header["Content-Length"]=Buffer.byteLength(h+e+a+d)+buffer.length;  
  62.         Header["Content-Type"]='multipart/form-data; boundary='+opts.boundary;  
  63.         options.headers=Header;  
  64.         options.method='POST';  
  65.         var req=http.request(options,function(res){  
  66.             var data='';  
  67.             res.on('data'function (chunk) {  
  68.                 data+=chunk;  
  69.             });  
  70.             res.on('end'function () {  
  71.                 console.log(res.statusCode)  
  72.                 console.log(data);  
  73.             });  
  74.         });  
  75.         req.write(h+e+a);log.diy(h+e+a+buffer+d);  
  76.         req.write(buffer);  
  77.         req.end(d);  
  78.     });  
  79.       
  80. }  
  81. //读取文件  
  82. function filereadstream(opts, fn) {  
  83.     var readstream = fs.createReadStream(opts.file,{flags:'r',encoding:null});  
  84.     var chunks=[];  
  85.     var length = 0;  
  86.     readstream.on('data'function(chunk) {  
  87.         length += chunk.length;  
  88.         chunks.push(chunk);  
  89.     });  
  90.     readstream.on('end'function() {  
  91.         var buffer = new Buffer(length);  
  92.         for(var i = 0, pos = 0, size = chunks.length; i < size; i++) {  
  93.             chunks[i].copy(buffer, pos);  
  94.             pos += chunks[i].length;  
  95.         }  
  96.         fn(buffer);  
  97.     });  
  98. }  
  99.   
  100. //各类设置  
  101. var opt={  
  102.     "url":"http://xxxx.xx",//url  
  103.     "file":"00.jpg",//文件位置  
  104.     "param":"file",//文件上传字段名  
  105.     "field":{//其余post字段  
  106.         "client":"1",  
  107.         "title":"ok"  
  108.     },  
  109.     "boundary":"----WebKitFormBoundary"+getBoundary()  
  110. }  
  111.   
  112. postRequest(opt);  
  113. /* 
  114. ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n 
  115.  
  116. Content-Disposition: form-data; name="file"; filename="00.jpg"\r\n 
  117. Content-Type: application/octet-stream 
  118. \r\n 
  119. \r\n +file\r\n 
  120.  
  121. ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n 
  122.  
  123. Content-Disposition: form-data; name="fieldName" 
  124. \r\n 
  125. \r\n +value\r\n 
  126.  
  127. ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt-- 
  128. */  
最后这个注释的是标准格式“\r\n”代表实际的字符串,为了看着舒服,视觉上也调整一下

参考:

参考自(XiongLiding) 所分享代码

 http://www.cnodejs.org/topic/4ffed8544764b729026b1da3

欢迎转载

转载请注明出处,谢谢


[javascript]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. var path=require("path");  
  2. var fs=require("fs");  
  3. var http=require("http");  
  4.   
  5. //post值payload  
  6. var getfield=function(field, value) {  
  7.     return 'Content-Disposition: form-data; name="'+field+'"\r\n\r\n'+value+'\r\n';  
  8. }  
  9.   
  10. //文件payload  
  11. var getfieldHead=function (field, filename) {  
  12.     var fileFieldHead='Content-Disposition: form-data; name="'+field+'"; filename="'+filename+'"\r\n'+'Content-Type: '+getMime(filename)+'\r\n\r\n';  
  13.     return fileFieldHead;  
  14. }  
  15. //获取Mime  
  16. var getMime=function (filename) {  
  17.     var mimes = {  
  18.         '.png''image/png',  
  19.         '.gif''image/gif',  
  20.         '.jpg''image/jpeg',  
  21.         '.jpeg''image/jpeg',  
  22.         '.js''appliction/json',  
  23.         '.torrent''application/octet-stream'  
  24.     };  
  25.     var ext = path.extname(filename);  
  26.     var mime = mimes[ext];  
  27.     mime=!!mime?mime:'application/octet-stream';  
  28.     return mime;  
  29. }  
  30. //获取边界检查随机串  
  31. var getBoundary=function() {  
  32.     var max = 9007199254740992;  
  33.     var dec = Math.random() * max;  
  34.     var hex = dec.toString(36);  
  35.     var boundary = hex;  
  36.     return boundary;  
  37. }  
  38. //获取boundary  
  39. var getBoundaryBorder=function (boundary) {  
  40.     return '--'+boundary+'\r\n';  
  41. }  
  42. //字段格式化  
  43. function fieldPayload(opts) {  
  44.     var payload=[];  
  45.     for(var id in opts.field){  
  46.         payload.push(getfield(id,opts.field[id]));  
  47.     }  
  48.     payload.push("");  
  49.     return payload.join(getBoundaryBorder(opts.boundary));  
  50. }  
  51.   
  52. //post数据  
  53. function postRequest (opts) {  
  54.     filereadstream(opts,function (buffer) {  
  55.         var options=require('url').parse(opts.url);  
  56.         var Header={};  
  57.         var h=getBoundaryBorder(opts.boundary);  
  58.         var e=fieldPayload(opts);  
  59.         var a=getfieldHead(opts.param,opts.file);  
  60.         var d="\r\n"+h;  
  61.         Header["Content-Length"]=Buffer.byteLength(h+e+a+d)+buffer.length;  
  62.         Header["Content-Type"]='multipart/form-data; boundary='+opts.boundary;  
  63.         options.headers=Header;  
  64.         options.method='POST';  
  65.         var req=http.request(options,function(res){  
  66.             var data='';  
  67.             res.on('data'function (chunk) {  
  68.                 data+=chunk;  
  69.             });  
  70.             res.on('end'function () {  
  71.                 console.log(res.statusCode)  
  72.                 console.log(data);  
  73.             });  
  74.         });  
  75.         req.write(h+e+a);log.diy(h+e+a+buffer+d);  
  76.         req.write(buffer);  
  77.         req.end(d);  
  78.     });  
  79.       
  80. }  
  81. //读取文件  
  82. function filereadstream(opts, fn) {  
  83.     var readstream = fs.createReadStream(opts.file,{flags:'r',encoding:null});  
  84.     var chunks=[];  
  85.     var length = 0;  
  86.     readstream.on('data'function(chunk) {  
  87.         length += chunk.length;  
  88.         chunks.push(chunk);  
  89.     });  
  90.     readstream.on('end'function() {  
  91.         var buffer = new Buffer(length);  
  92.         for(var i = 0, pos = 0, size = chunks.length; i < size; i++) {  
  93.             chunks[i].copy(buffer, pos);  
  94.             pos += chunks[i].length;  
  95.         }  
  96.         fn(buffer);  
  97.     });  
  98. }  
  99.   
  100. //各类设置  
  101. var opt={  
  102.     "url":"http://xxxx.xx",//url  
  103.     "file":"00.jpg",//文件位置  
  104.     "param":"file",//文件上传字段名  
  105.     "field":{//其余post字段  
  106.         "client":"1",  
  107.         "title":"ok"  
  108.     },  
  109.     "boundary":"----WebKitFormBoundary"+getBoundary()  
  110. }  
  111.   
  112. postRequest(opt);  
  113. /* 
  114. ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n 
  115.  
  116. Content-Disposition: form-data; name="file"; filename="00.jpg"\r\n 
  117. Content-Type: application/octet-stream 
  118. \r\n 
  119. \r\n +file\r\n 
  120.  
  121. ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt\r\n 
  122.  
  123. Content-Disposition: form-data; name="fieldName" 
  124. \r\n 
  125. \r\n +value\r\n 
  126.  
  127. ------WebKitFormBoundaryuzKmkAovUuYsQ1Dt-- 
  128. */  
最后这个注释的是标准格式“\r\n”代表实际的字符串,为了看着舒服,视觉上也调整一下

参考:

参考自(XiongLiding) 所分享代码

 http://www.cnodejs.org/topic/4ffed8544764b729026b1da3

欢迎转载

转载请注明出处,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值