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入门详解(多篇文章结合)
Mar 07 NodeJs
用nodejs写的一个简单项目打包工具
May 11 NodeJs
Nodejs中自定义事件实例
Jun 20 NodeJs
基于NodeJS的前后端分离的思考与实践(五)多终端适配
Sep 26 NodeJs
nodejs中实现阻塞实例
Mar 24 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
详解nodejs微信公众号开发——5.素材管理接口
Apr 11 NodeJs
nodejs操作mongodb的增删改查功能实例
Nov 09 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 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
一棵php的类树(支持无限分类)
2006/10/09 PHP
PHP中的float类型使用说明
2010/07/27 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
PHP中echo与print区别点整理
2021/03/09 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
javascript 获取图片颜色
2009/04/05 Javascript
js和jquery如何获取图片真实的宽度和高度
2014/09/28 Javascript
jquery 操作css样式、位置、尺寸方法汇总
2014/11/28 Javascript
javascript实现简单的分页特效
2015/08/12 Javascript
关于cookie的初识和运用(js和jq)
2016/04/07 Javascript
浅谈javascript基础之客户端事件驱动
2016/06/10 Javascript
js eval函数使用,js对象和字符串互转实例
2017/03/06 Javascript
vue.js如何更改默认端口号8080为指定端口的方法
2017/07/14 Javascript
微信小程序 Animation实现图片旋转动画示例
2018/08/22 Javascript
vue实现弹框遮罩点击其他区域弹框关闭及v-if与v-show的区别介绍
2018/09/29 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
基于react项目打包css引用路径错误解决方案
2020/10/28 Javascript
新手学习Python2和Python3中print不同的用法
2020/06/09 Python
幼师自荐信
2013/10/26 职场文书
大学军训感言600字
2014/02/25 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
关于建议书的格式范文
2014/05/20 职场文书
酒店节能减排方案
2014/05/26 职场文书
爱护公物标语
2014/06/24 职场文书
乡镇党建工作汇报材料
2014/08/14 职场文书
出生医学证明书
2014/09/15 职场文书
2014镇副书记群众路线专题民主生活会思想汇报
2014/09/23 职场文书
我的大学四年规划书范文2014
2014/09/26 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
门市房租房协议书
2014/12/04 职场文书
大学推普周活动总结
2015/05/07 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python