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 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
详解nodejs中的process进程
Mar 19 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
手把手教你把nodejs部署到linux上跑出hello world
Jun 19 NodeJs
使用nodeJs来安装less及编译less文件为css文件的方法
Nov 20 NodeJs
nodejs基于WS模块实现WebSocket聊天功能的方法
Jan 12 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
nodejs处理tcp连接的核心流程
Feb 26 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中让curl支持sock5的代码实例
2015/01/21 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP实现动态获取函数参数的方法示例
2018/04/02 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
JavaScript 全角转半角部分
2009/10/28 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
基于vue组件实现猜数字游戏
2020/05/28 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python中内建函数的简单用法说明
2016/05/05 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
python中关于数据类型的学习笔记
2020/07/19 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
利用HTML5画出一个坦克的形状具体实现代码
2013/06/20 HTML / CSS
html5设计原理(推荐收藏)
2014/05/17 HTML / CSS
茶叶店创业计划书范文
2014/01/19 职场文书
暑期社会实践感言
2014/02/25 职场文书
作风大整顿心得体会
2014/09/10 职场文书
放假通知格式
2015/04/14 职场文书
安全教育观后感
2015/06/17 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
MySQL 全文检索的使用示例
2021/06/07 MySQL