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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
NodeJS中利用Promise来封装异步函数
Feb 25 NodeJs
nodejs基础应用
Feb 03 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
NodeJS爬虫实例之糗事百科
Dec 14 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
CentOS7中源码编译安装NodeJS的完整步骤
Oct 13 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
Nodejs实现WebSocket代码实例
May 19 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
全国FM电台频率大全 - 28 甘肃省
2020/03/11 无线电
php导出csv数据在浏览器中输出提供下载或保存到文件的示例
2014/04/24 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php删除指定目录的方法
2015/04/03 PHP
关于html+ashx开发中几个问题的解决方法
2011/07/18 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
基于javascript实现单选及多选的向右和向左移动实例
2015/07/25 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
element ui table 增加筛选的方法示例
2018/11/02 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
js动态添加带圆圈序号列表的实例代码
2021/02/18 Javascript
[48:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第二场 1月29日
2021/03/11 DOTA
python中实现控制小数点位数的方法
2019/01/24 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
Python如何实现强制数据类型转换
2019/11/22 Python
Python 高效编程技巧分享
2020/09/10 Python
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
Java面试题汇总
2015/12/06 面试题
公司财务自我评价分享
2013/12/17 职场文书
成考报名单位证明范本
2014/01/16 职场文书
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
委托书范本
2014/04/02 职场文书
投标授权委托书范文
2014/08/02 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
三年级作文之小小梦想
2019/12/06 职场文书