NodeJs实现简易WEB上传下载服务器
项目上的需求是集群均可生成PDF文件或是访问PDF文件,但是没有文件服务器,故做一个简易的文件服务器。
解决方案:集群内的机器(客户端)生成PDF文件之后将PDF文件推给文件服务器,我们暂且称它为服务端;如果某个客户端需要访问到这个PDF文件,则去服务端获取(因为可能其他客户端已经生成了该PDF文件),如果没有找到,则自己客户端生成PDF文件,再将PDF文件推给服务端。
为了实施简易,现采取NodeJs来实现一个小程序。不多说,直接上代码:
server.js
varexpress=require('express'); varurl=require('url'); varfs=require('fs'); varhttp=require('http'); varqueryString=require('querystring'); varbodyParser=require('body-parser'); varpath=require('path'); varapp=express(); app.use(bodyParser.json({limit:'1000kb'})); app.use(bodyParser.urlencoded({limit:'1000kb',extended:true})); varcount=0; app.post('/upload.node',function(req,resp){ console.log('上传请求'+(newDate())); vardata=newBuffer(req.body.fileData,'base64'); varfilePath=req.body.filePath; varpathObj=path.parse(filePath);//对文件路径字符串进行操作 varresponseBody={}; mkdirsSync(pathObj.dir);//递归创建文件目录 try{ varwriterStream=fs.createWriteStream(filePath); writerStream.write(data); writerStream.end(); writerStream.on('finish',function(){ console.log('上传完成'+(newDate())); }); writerStream.on('error',function(err){ console.log(err.stack); }); responseBody=JSON.stringify({ returnMsg:'200' }); }catch(err){ console.log('上传出错'+(newDate())); responseBody=JSON.stringify({ returnMsg:'400' }); } //写入文件 //console.log('***'+count+'***'); resp.status(200).end(responseBody.toString()); }); app.post('/download.node',function(req,resp){ console.log('下载请求'+(newDate())); varfilePath=req.body.filePath; console.log('download'); varresponseBody={}; if(fs.existsSync(filePath)){ vardata=fs.readFileSync(filePath); vardataBase64=data.toString('base64'); responseBody=JSON.stringify({ returnMsg:'200', filePath:filePath, fileData:dataBase64 }); console.log('下载完成'+(newDate())); }else{ responseBody=JSON.stringify({ returnMsg:'400' }); console.log('文件未找到'+(newDate())); } //console.log('***'+++count+'***'); resp.status(200).end(responseBody.toString()); }); //递归创建文件目录同步方法 functionmkdirsSync(filePath){ if(fs.existsSync(filePath)){ returntrue; }else{ if(mkdirsSync(path.dirname(filePath))){ fs.mkdirSync(filePath); returntrue; } } } varserver=app.listen(20001,function(){ console.log('Serverstarted.'); })
提供一个测试js代码.. 浏览器通过get请求http://127.0.0.1:20000/upload.do?filePath=XXXX即可触发上传过程
varexpress=require('express'); varurl=require('url'); varfs=require('fs'); varhttp=require('http'); varqueryString=require('querystring'); varbodyParser=require('body-parser'); varapp=express(); app.use(bodyParser.json({limit:'1000kb'})); app.use(bodyParser.urlencoded({limit:'1000kb',extended:true})); varcount=0; app.get('/upload.do',function(req,resp){ console.log('upload.do'); //varpath=url.parse(req.url).pathname; //console.log('Requestfor'+path); varfilePath=req.query.filePath; //varfileData=req.query.fileData; varaddress=req.query.address; upload(filePath,'127.0.0.1',20001); console.log('***'+++count+'***'); varresponse={ "first":req.query.filePath, "last":req.query.address }; resp.end(JSON.stringify(response)); }); functionupload(filePath,address,port){ varData=readFile(filePath); vardataBase64=Data.toString('base64'); console.log(Data); console.log(dataBase64); //varDataJSON=JSON.stringify(Data); //fs.writeFile('D:/input.txt',dataBase64,function(err){ //if(err){ //console.err(err); //} //}); varJsonData=queryString.stringify({ filePath:filePath, fileData:dataBase64 }); //console.log(JsonData); varoptions={ method:"POST", host:address, port:port, path:'/upload.node', headers:{ 'Content-Type':'application/x-www-form-urlencoded' } }; varreq=http.request(options,function(res){ res.setEncoding('utf8'); }); req.write(JsonData); req.end(); } functionreadFile(filePath){ varfileData=''; try{ fileData=fs.readFileSync(filePath); }catch(e){ fileData=''; } returnfileData; } app.post('/download.do',function(req,resp){ //可直接参考server.js的代码 }) varserver=app.listen(20000,function(){ console.log('Serverstarted.'); })
这仅仅是一个简易的Nodejs程序,直接用此程序去压测,得到结果是每秒可处理八十多个请求,基本上能满足现在的需求,还有很多改进的地方,比如加入缓存,队列....等等。
对于NodeJs本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。