zl程序教程

您现在的位置是:首页 >  后端

当前栏目

nodejs实现模拟form表单上传文件

Nodejs文件上传模拟 实现 表单 Form
2023-06-13 09:15:37 时间

以前项目里有这个方法,最近在客户那里出问题了,同事说,这个方法从来就没管用过,SO,用了一天时间把这个方法给搞出来了(觉得花费的时间长了点),分享之。

代码及测试用例:

varhttp=require("http");
varpath=require("path");
varfs=require("fs");

functionpostFile(fileKeyValue,req){
varboundaryKey=Math.random().toString(16);
varenddata="\r\n----"+boundaryKey+"--";

varfiles=newArray();
for(vari=0;i<fileKeyValue.length;i++){
varcontent="\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";
varcontentBinary=newBuffer(content,"utf-8");//当编码为ascii时,中文会乱码。
files.push({contentBinary:contentBinary,filePath:fileKeyValue[i].urlValue});
}
varcontentLength=0;
for(vari=0;i<files.length;i++){
varstat=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));

//将参数发出
varfileindex=0;
vardoOneFile=function(){
req.write(files[fileindex].contentBinary);
varfileStream=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
varfiles=[
{urlKey:"file1",urlValue:"E:\\DFBF.jpg"},
{urlKey:"file2",urlValue:"E:\\1.jpg"},
{urlKey:"file3",urlValue:"E:\\Pro空格中文.mp3"}
]
varoptions={
host:"localhost",
port:"8908",
method:"POST",
path:"/Home/Upload"
}

varreq=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("problemwithrequest:"+e.message);
console.log(e);
})
postFile(files,req);
console.log("done");

服务端测试,用mvc在home控制器写了个upload方法,并遍历上传的文件将其保存在硬盘上了。

只是上传大文件会有问题,估计是需要服务器进行配置,暂且不管。

服务端方法(写在了Home控制器下)

[HttpPost]
publicstringUpload()
{
//HttpPostedFileBasefile=this.Request.Files["file"];

//file.SaveAs(file.FileName);

foreach(stringfileinthis.Request.Files)
{
this.Request.Files[file].SaveAs(@"E:\新建文件夹\"+this.Request.Files[file].FileName);
}

return@"保存成功路径:E:\新建文件夹\";
}

运行脚本:

nodenodejsPostFile.js

运行结果: