nodejs 實(shí)現(xiàn)模擬form表單上傳文件
以前項(xiàng)目里有這個(gè)方法,最近在客戶那里出問題了,同事說,這個(gè)方法從來就沒管用過,SO,用了一天時(shí)間把這個(gè)方法給搞出來了(覺得花費(fèi)的時(shí)間長了點(diǎn)),分享之。
代碼及測試用例:
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');//當(dāng)編碼為ascii時(shí),中文會(huì)亂碼。
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));
// 將參數(shù)發(fā)出
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");
服務(wù)端測試,用mvc在home控制器寫了個(gè)upload方法,并遍歷上傳的文件將其保存在硬盤上了。
只是上傳大文件會(huì)有問題,估計(jì)是需要服務(wù)器進(jìn)行配置,暫且不管。
服務(wù)端方法(寫在了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:\新建文件夾\";
}
運(yùn)行腳本:
node nodejsPostFile.js
運(yùn)行結(jié)果:

相關(guān)文章
使用Node.js創(chuàng)建HTTP服務(wù)器并實(shí)現(xiàn)公網(wǎng)訪問本地Server的步驟
Node.js含有一系列內(nèi)置模塊,使得程序可以脫離 Apache HTTP Server 或 IIS,作為獨(dú)立服務(wù)器運(yùn),下面將介紹如何簡單幾步實(shí)現(xiàn)遠(yuǎn)程公共網(wǎng)絡(luò)下訪問windwos node.js的服務(wù)端,感興趣的朋友一起看看吧2023-11-11
node.js使用免費(fèi)的阿里云ip查詢獲取ip所在地【推薦】
這篇文章主要介紹了node.js使用免費(fèi)的阿里云ip查詢獲取ip所在地的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-09-09
三分鐘教會(huì)你用nodejs操作mysql數(shù)據(jù)庫
MySQL數(shù)據(jù)庫作為最流行的開源數(shù)據(jù)庫,基本上是每個(gè)web開發(fā)者必須要掌握的數(shù)據(jù)庫程序之一了,基本使用?node.js上,最受歡迎的mysql包就是mysql模塊,下面這篇文章主要給大家介紹了關(guān)于如何通過三分鐘教會(huì)你用nodejs操作mysql數(shù)據(jù)庫,需要的朋友可以參考下2023-05-05
webpack創(chuàng)建項(xiàng)目并打包的詳細(xì)流程記錄
webpack在前端工程領(lǐng)域起到了中流砥柱的作用,理解它的內(nèi)部實(shí)現(xiàn)機(jī)制會(huì)對你的工程建設(shè)提供很大的幫助(不論是定制功能還是優(yōu)化打包),下面這篇文章主要給大家介紹了關(guān)于webpack創(chuàng)建項(xiàng)目并打包的詳細(xì)流程,需要的朋友可以參考下2023-03-03
快速刪除 node_modules 目錄的集中方法(多種方法)
本文介紹了三種快速刪除node_modules目錄的方法:使用rimraf工具、通過npx運(yùn)行rimraf以及在Windows命令提示符中使用del命令,每種方法都適合不同的操作系統(tǒng)和使用場景2024-11-11
用C/C++來實(shí)現(xiàn) Node.js 的模塊(二)
上篇文章的主要內(nèi)容講訴了用C/C++來實(shí)現(xiàn) Node.js 的模塊,本文更深一步繼續(xù)探討這個(gè)問題,有需要的朋友可以參考下2014-09-09

