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实现的一个静态服务器实例
Dec 06 NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
NodeJs读取JSON文件格式化时的注意事项
Sep 25 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
详解NodeJs开发微信公众号
May 25 NodeJs
nodejs的安装使用与npm的介绍
Sep 11 NodeJs
nodejs实现的http、https 请求封装操作示例
Feb 06 NodeJs
nodejs中内置模块fs,path常见的用法说明
Nov 07 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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求最大子序列和的算法实现
2011/06/24 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
PHP源码分析之变量的存储过程分解
2014/07/03 PHP
php获取excel文件数据
2017/04/21 PHP
js活用事件触发对象动作
2008/08/10 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
Extjs4中Form的使用之本地hiddenfield
2013/11/26 Javascript
基于js中的原型、继承的一些想法
2016/08/10 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
基于webpack 实用配置方法总结
2017/09/28 Javascript
react 创建单例组件的方法
2018/04/26 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
vue缓存的keepalive页面刷新数据的方法
2019/04/23 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
[01:06:26]全国守擂赛第二周 Team Coach vs DeMonsTer
2020/04/28 DOTA
Python实现的简单dns查询功能示例
2017/05/24 Python
python装饰器深入学习
2018/04/06 Python
python 读取DICOM头文件的实例
2018/05/07 Python
Python安装selenium包详细过程
2019/07/23 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
英国、欧洲和全球租车服务:Avis英国
2016/08/29 全球购物
汇科协同Java笔试题
2012/03/31 面试题
工程项目建议书范文
2014/03/12 职场文书
大学班级计划书
2014/04/29 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
2015元旦标语横幅
2014/12/09 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
实用干货:敬酒词大全,帮你应付各种场合
2019/11/21 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
Python字符串常规操作小结
2022/04/03 Python