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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
使用Nodejs开发微信公众号后台服务实例
Sep 03 NodeJs
NodeJS连接MongoDB数据库时报错的快速解决方法
May 13 NodeJs
Nodejs全局安装和本地安装的不同之处
Jul 04 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
nodejs对express中next函数的一些理解
Sep 08 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
解决nodejs的npm命令无反应的问题
May 17 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操作JSON格式数据的实现代码
2011/12/24 PHP
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP chop()函数讲解
2019/02/11 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
jquery下将选择的checkbox的id组成字符串的方法
2010/11/28 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
js中call()和apply()改变指针问题的讲解
2019/01/17 Javascript
微信小程序五子棋游戏的棋盘,重置,对弈实现方法【附demo源码下载】
2019/02/20 Javascript
[02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
2016/06/28 DOTA
Python编程产生非均匀随机数的几种方法代码分享
2017/12/13 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
说出ArrayList,Vector, LinkedList的存储性能和特性
2015/01/04 面试题
JMS中Topic和Queue有什么区别
2013/05/15 面试题
标准导师推荐信(医学类)
2013/10/28 职场文书
青年文明号事迹材料
2014/01/18 职场文书
幼儿园门卫制度
2014/01/29 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
个人租房协议书
2014/11/28 职场文书
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
2022/03/21 Java/Android
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL