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
运行结果:
相关文章
- Nodejs后端框架搭建(express)
- 【说站】NodeJS如何在文件中追加内容
- 【说站】NodeJS如何创建目录和文件
- NodeJS监视文件
- 35·灵魂前端工程师养成-使用nodejs实现简单nginx功能
- nodejs控制windows关机重启
- pm2:在生产环境中运行 nodejs 应用
- 我用nodejs实现了热加载接口文件,感觉又离“serverless”进了一步
- 云函数实现网站自动化签到配置详解【Web函数/Nodejs/cookie】
- 彻底搞懂nodejs事件循环_2023-03-15
- 拿nodejs快速搭建简单Oauth认证和restful API server攻略详解编程语言
- Nodejs的运行原理-函数回调篇详解编程语言
- Nodejs的运行原理-架构篇详解编程语言
- [nodejs] nodejs开发个人博客(六)数据分页详解编程语言
- javascript结合nodejs实现多文件上传详解编程语言
- Nodejs与Oracle相结合,开拓新技术时代(node oracle)
- NodeJS的模块写法入门(实例代码)
- nodejs的require模块(文件模块/核心模块)及路径介绍
- Nodejs极简入门教程(一):模块机制
- 轻松创建nodejs服务器(9):实现非阻塞操作
- 轻松创建nodejs服务器(10):处理上传图片
- NodeJS学习笔记之MongoDB模块