NodeJs实现简易WEB上传下载服务器
程序员文章站
2022-04-09 12:48:26
项目上的需求是集群均可生成pdf文件或是访问pdf文件,但是没有文件服务器,故做一个简易的文件服务器。
解决方案:集群内的机器(客户端)生成pdf文件之后将pdf文件推给...
项目上的需求是集群均可生成pdf文件或是访问pdf文件,但是没有文件服务器,故做一个简易的文件服务器。
解决方案:集群内的机器(客户端)生成pdf文件之后将pdf文件推给文件服务器,我们暂且称它为服务端;如果某个客户端需要访问到这个pdf文件,则去服务端获取(因为可能其他客户端已经生成了该pdf文件),如果没有找到,则自己客户端生成pdf文件,再将pdf文件推给服务端。
为了实施简易,现采取nodejs来实现一个小程序。 不多说,直接上代码:
server.js
var express = require('express'); var url = require('url'); var fs = require('fs'); var http = require('http'); var querystring = require('querystring'); var bodyparser = require('body-parser'); var path=require('path'); var app = express(); app.use(bodyparser.json({limit:'1000kb'})); app.use(bodyparser.urlencoded({limit:'1000kb',extended:true})); var count=0; app.post('/upload.node',function(req,resp){ console.log('上传请求 '+ (new date())); var data = new buffer(req.body.filedata,'base64'); var filepath = req.body.filepath; var pathobj = path.parse(filepath);//对文件路径字符串进行操作 var responsebody = {}; mkdirssync(pathobj.dir);//递归创建文件目录 try{ var writerstream = fs.createwritestream(filepath); writerstream.write(data); writerstream.end(); writerstream.on('finish', function() { console.log('上传完成 '+ (new date())); }); writerstream.on('error', function(err){ console.log(err.stack); }); responsebody=json.stringify({ returnmsg:'200' }); }catch(err){ console.log('上传出错 '+ (new date())); responsebody=json.stringify({ returnmsg:'400' }); } //写入文件 //console.log('*** ' + count +' ***'); resp.status(200).end(responsebody.tostring()); }); app.post('/download.node',function(req,resp){ console.log('下载请求 '+ (new date())); var filepath = req.body.filepath; console.log('download'); var responsebody = {}; if(fs.existssync(filepath)){ var data = fs.readfilesync(filepath); var database64 = data.tostring('base64'); responsebody = json.stringify({ returnmsg:'200', filepath:filepath, filedata:database64 }); console.log('下载完成 '+ (new date())); }else{ responsebody=json.stringify({ returnmsg:'400' }); console.log('文件未找到 '+ (new date())); } //console.log('*** ' + ++count +' ***'); resp.status(200).end(responsebody.tostring()); }); //递归创建文件目录 同步方法 function mkdirssync(filepath){ if(fs.existssync(filepath)){ return true; }else{ if(mkdirssync(path.dirname(filepath))){ fs.mkdirsync(filepath); return true; } } } var server = app.listen(20001,function(){ console.log('server started.'); })
提供一个测试js代码.. 浏览器通过get请求 http://127.0.0.1:20000/upload.do?filepath=xxxx即可触发上传过程
var express = require('express'); var url = require('url'); var fs = require('fs'); var http = require('http'); var querystring = require('querystring'); var bodyparser = require('body-parser'); var app = express(); app.use(bodyparser.json({limit:'1000kb'})); app.use(bodyparser.urlencoded({limit:'1000kb',extended:true})); var count=0; app.get('/upload.do',function(req,resp){ console.log('upload.do'); //var path = url.parse(req.url).pathname; //console.log('request for ' + path); var filepath = req.query.filepath; //var filedata = req.query.filedata; var address = req.query.address; upload(filepath,'127.0.0.1',20001); console.log('*** ' + ++count +' ***'); var response = { "first":req.query.filepath, "last":req.query.address }; resp.end(json.stringify(response)); }); function upload(filepath,address,port){ var data = readfile(filepath); var database64 = data.tostring('base64'); console.log(data); console.log(database64); //var datajson = json.stringify(data); //fs.writefile('d:/input.txt',database64,function(err){ // if(err){ // console.err(err); // } //}); var jsondata = querystring.stringify({ filepath:filepath, filedata:database64 }); //console.log(jsondata); var options = { method: "post", host : address, port : port, path : '/upload.node', headers: { 'content-type':'application/x-www-form-urlencoded' } }; var req = http.request(options, function(res){ res.setencoding('utf8'); }); req.write(jsondata); req.end(); } function readfile(filepath){ var filedata = ''; try{ filedata = fs.readfilesync(filepath); }catch(e){ filedata = ''; } return filedata; } app.post('/download.do',function(req,resp){ //可直接参考server.js的代码 }) var server = app.listen(20000,function(){ console.log('server started.'); })
这仅仅是一个简易的nodejs程序,直接用此程序去压测,得到结果是每秒可处理八十多个请求,基本上能满足现在的需求,还有很多改进的地方,比如加入缓存,队列....等等。
对于nodejs本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。