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极简入门教程(一):模块机制
Oct 25 NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
详解nodejs 文本操作模块-fs模块(一)
Dec 22 NodeJs
简单好用的nodejs 爬虫框架分享
Mar 26 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
通过nodejs 服务器读取HTML文件渲染到页面的方法
May 17 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 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
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
学习jquery之一
2007/04/27 Javascript
jquery 选择器部分整理
2009/10/28 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
js学习总结之DOM2兼容处理this问题的解决方法
2017/07/27 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
原生js实现瀑布流效果
2020/03/09 Javascript
Jquery高级应用Deferred对象原理及使用实例
2020/05/28 jQuery
Python中splitlines()方法的使用简介
2015/05/20 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
Python 的字典(Dict)是如何存储的
2019/07/05 Python
python实现井字棋小游戏
2020/03/04 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
python 检测图片是否有马赛克
2020/12/01 Python
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
违反工作纪律检讨书
2014/02/15 职场文书
竞选学生会主席演讲稿
2014/04/24 职场文书
2015秋季开学典礼致辞
2015/07/16 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书