NodeJs实现简易WEB上传下载服务器

项目上的需求是集群均可生成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本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容