欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-05 12:13:10
项目上的需求是集群均可生成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本人也只是学到了一点皮毛,还有很多知识点没去探究。大家看看就行。

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