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本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。