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教程之异步I/O
Nov 21 NodeJs
Nodejs中读取中文文件编码问题、发送邮件和定时任务实例
Jan 01 NodeJs
nodejs通过phantomjs实现下载网页
May 04 NodeJs
nodeJS删除文件方法示例
Dec 25 NodeJs
用nodejs搭建websocket服务器
Jan 23 NodeJs
解决nodejs中使用http请求返回值为html时乱码的问题
Feb 18 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 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 MessagePack介绍
2013/10/06 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
PHP JWT初识及其简单示例
2018/10/10 PHP
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
浅谈页面装载js及性能分析方法
2014/12/09 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
jQuery实现仿Google首页拖动效果的方法
2015/05/04 Javascript
node.js操作mysql(增删改查)
2015/07/24 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
2020/09/07 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
javascript this指向相关问题及改变方法
2020/11/19 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
VTK与Python实现机械臂三维模型可视化详解
2017/12/13 Python
Python将一个Excel拆分为多个Excel
2018/11/07 Python
对Python多线程读写文件加锁的实例详解
2019/01/14 Python
python列表使用实现名字管理系统
2019/01/30 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
Python grpc超时机制代码示例
2020/09/14 Python
PHP高级工程师面试问题推荐
2013/01/18 面试题
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
2013/05/18 面试题
学生发电厂实习自我鉴定
2013/09/22 职场文书
药剂学专业应届生自荐信
2013/09/29 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
党性心得体会
2014/09/03 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python