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 28 NodeJs
Ubuntu中搭建Nodejs开发环境过程分享
Jun 01 NodeJs
nodejs文件操作模块FS(File System)常用函数简明总结
Jun 05 NodeJs
Nodejs异步回调的优雅处理方法
Sep 25 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
详解nodejs 文本操作模块-fs模块(三)
Dec 22 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
手把手教你如何使用nodejs编写cli命令行
Nov 05 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 25 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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+JS+rsa数据加密传输实现代码
2011/03/23 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
php链式操作的实现方式分析
2019/08/12 PHP
JSQL SQLProxy 的 php 版本代码
2010/05/05 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
JS对select控件option选项的增删改查示例代码
2013/10/21 Javascript
前端开发过程中浏览器版本的两种判定方法
2013/10/30 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
js用闭包遍历树状数组的方法
2014/03/19 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
ASP.NET jquery ajax传递参数的实例
2016/11/02 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
vue中filters 传入两个参数 / 使用两个filters的实现方法
2019/07/15 Javascript
vue 判断两个时间插件结束时间必选大于开始时间的代码
2020/11/04 Javascript
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
python制作图片缩略图
2019/04/30 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
用CSS3打造HTML5的Logo(实现代码)
2016/06/16 HTML / CSS
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
化学教师教学反思
2014/01/17 职场文书
关于安全的广播稿
2014/10/23 职场文书
医德医风学习心得体会
2016/01/25 职场文书
MySQL约束超详解
2021/09/04 MySQL
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL
Python实战之大鱼吃小鱼游戏的实现
2022/04/01 Python