nodejs 实现模拟form表单上传文件


Posted in NodeJs onJuly 14, 2014

以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的时间长了点),分享之。

代码及测试用例:

var http = require('http');
var path = require('path');
var fs = require('fs');

function postFile(fileKeyValue, req) {
  var boundaryKey = Math.random().toString(16);
  var enddata = '\r\n----' + boundaryKey + '--';

  var files = new Array();
  for (var i = 0; i < fileKeyValue.length; i++) {
   var content = "\r\n----" + boundaryKey + "\r\n" + "Content-Type: application/octet-stream\r\n" + "Content-Disposition: form-data; name=\"" + fileKeyValue[i].urlKey + "\"; filename=\"" + path.basename(fileKeyValue[i].urlValue) + "\"\r\n" + "Content-Transfer-Encoding: binary\r\n\r\n";
   var contentBinary = new Buffer(content, 'utf-8');//当编码为ascii时,中文会乱码。
   files.push({contentBinary: contentBinary, filePath: fileKeyValue[i].urlValue});
  }
  var contentLength = 0;
  for (var i = 0; i < files.length; i++) {
   var stat = fs.statSync(files[i].filePath);
   contentLength += files[i].contentBinary.length;
   contentLength += stat.size;
  }

  req.setHeader('Content-Type', 'multipart/form-data; boundary=--' + boundaryKey);
  req.setHeader('Content-Length', contentLength + Buffer.byteLength(enddata));

  // 将参数发出
  var fileindex = 0;
  var doOneFile = function(){
   req.write(files[fileindex].contentBinary);
   var fileStream = fs.createReadStream(files[fileindex].filePath, {bufferSize : 4 * 1024});
   fileStream.pipe(req, {end: false});
   fileStream.on('end', function() {
     fileindex++;
     if(fileindex == files.length){
      req.end(enddata);
     } else {
      doOneFile();
     }
   });
  };
  if(fileindex == files.length){
    req.end(enddata);
  } else {
    doOneFile();
  }      
}

//测试用例
//http://nodejs.org/api/http.html#http_http_request_options_callback
var files = [
 {urlKey: "file1", urlValue: "E:\\DFBF.jpg"},
 {urlKey: "file2", urlValue: "E:\\1.jpg"},
 {urlKey: "file3", urlValue: "E:\\Pro 空格 中文.mp3"}
]
var options = { 
 host: "localhost", 
 port: "8908" , 
 method: "POST", 
 path: "/Home/Upload"
}

var req = http.request(options, function(res){
 console.log("RES:" + res);
 console.log('STATUS: ' + res.statusCode);
 console.log('HEADERS: ' + JSON.stringify(res.headers));
 //res.setEncoding("utf8");
 res.on("data", function(chunk){
  console.log("BODY:" + chunk);
 })
})

req.on('error', function(e){
 console.log('problem with request:' + e.message);
 console.log(e);
})
postFile(files, req);
console.log("done");

服务端测试,用mvc在home控制器写了个upload方法,并遍历上传的文件将其保存在硬盘上了。

只是上传大文件会有问题,估计是需要服务器进行配置,暂且不管。

服务端方法(写在了Home控制器下)

[HttpPost]
    public string Upload()
    {
      //HttpPostedFileBase file = this.Request.Files["file"];

      //file.SaveAs(file.FileName);

      foreach (string file in this.Request.Files)
      {
        this.Request.Files[file].SaveAs(@"E:\新建文件夹\" + this.Request.Files[file].FileName);
      }

      return @"保存成功 路径:E:\新建文件夹\";
    }

运行脚本:

node nodejsPostFile.js

运行结果:

nodejs 实现模拟form表单上传文件

NodeJs 相关文章推荐
NodeJS的模块写法入门(实例代码)
Mar 07 NodeJs
PHP和NodeJs开发的应用如何共用Session
Apr 16 NodeJs
Nodejs express框架一个工程中同时使用ejs模版和jade模版
Dec 28 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
NodeJS实现微信公众号关注后自动回复功能
May 31 NodeJs
nodeJS微信分享
Dec 20 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
14款NodeJS Web框架推荐
Jul 11 #NodeJs
基于promise.js实现nodejs的promises库
Jul 06 #NodeJs
我的NodeJs学习小结(一)
Jul 06 #NodeJs
nodejs中使用monk访问mongodb
Jul 06 #NodeJs
nodejs之请求路由概述
Jul 05 #NodeJs
Nodejs中自定义事件实例
Jun 20 #NodeJs
Nodejs sublime text 3安装与配置
Jun 19 #NodeJs
You might like
php 无限级 SelectTree 类
2009/05/19 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
jQuery Validate设置onkeyup验证的实例代码
2016/12/09 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
TensorFlow 滑动平均的示例代码
2018/06/19 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
2019/06/17 Python
Python循环结构的应用场景详解
2019/07/11 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
2019/12/13 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
实习会计求职自荐信范文
2014/03/10 职场文书
保险公司早会主持词
2014/03/22 职场文书
新文化运动的口号
2014/06/21 职场文书
社区好人好事材料
2014/12/26 职场文书
Python一行代码实现自动发邮件功能
2021/05/30 Python
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫
golang操作rocketmq的示例代码
2022/04/06 Golang
js判断两个数组相等的5种方法
2022/05/06 Javascript