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的url截取模块url-extract的使用实例
Nov 18 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
使用nodejs爬取前程无忧前端技能排行
May 06 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 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数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
js计算页面刷新的次数
2009/07/20 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
js multiple全选与取消全选实现代码
2012/12/04 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
js 获取站点应用名的简单实例
2016/08/18 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
Vue创建头部组件示例代码详解
2018/10/23 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
微信小程序云开发如何实现数据库自动备份实现
2019/08/16 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
Python简单操作sqlite3的方法示例
2017/03/22 Python
python文本数据相似度的度量
2018/03/12 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
nohup后台启动Python脚本,log不刷新的解决方法
2019/01/14 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Python 中list ,set,dict的大规模查找效率对比详解
2019/10/11 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
python如何快速拼接字符串
2020/10/28 Python
ECCO爱步加拿大官网:北欧丹麦鞋履及皮具品牌
2017/07/08 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
网络技术专业推荐信
2014/02/20 职场文书
中药学自荐信
2014/06/15 职场文书
党的群众路线教育实践活动心得体会(教师)
2014/10/31 职场文书
技术支持岗位职责
2015/02/13 职场文书
英语教师求职信范文
2015/03/20 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js