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本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。

以上是 NodeJs实现简易WEB上传下载服务器 的全部内容, 来源链接: utcz.com/z/344293.html

回到顶部