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 win7下安装方法
May 24 NodeJs
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
Nov 20 NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
NodeJS自定义模块写法(详解)
Jun 27 NodeJs
NodeJS收发GET和POST请求的示例代码
Aug 25 NodeJs
Nodejs调用WebService的示例代码
Sep 29 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
nodejs文件夹深层复制功能
Sep 03 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
类的另类用法--数据的封装
2006/10/09 PHP
PHP中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
PHP 编程安全性小结
2010/01/08 PHP
ExtJS与PHP、MySQL实现存储的方法
2010/04/02 PHP
php采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
AngularJS基础 ng-include 指令简单示例
2016/08/01 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
javaScript基础详解
2017/01/19 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python数组遍历的简单实现方法小结
2016/04/27 Python
python3+PyQt5重新实现QT事件处理程序
2018/04/19 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
python调用matlab的m自定义函数方法
2019/02/18 Python
如何通过Python实现标签云算法
2019/07/02 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
浅谈keras中Dropout在预测过程中是否仍要起作用
2020/07/09 Python
5分钟弄清楚html5的drag and drop(小结)
2019/04/10 HTML / CSS
html5时钟实现代码
2010/10/22 HTML / CSS
党员承诺书范文
2014/05/19 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
法律服务所工作总结
2015/08/10 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
python函数的两种嵌套方法使用
2022/04/02 Python