nodejs 實現類比form表單上傳檔案_node.js

來源:互聯網
上載者:User

以前項目裡有這個方法,最近在客戶那裡出問題了,同事說,這個方法從來就沒管用過,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_callbackvar 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

運行結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.