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


Posted in NodeJs onAugust 10, 2019

项目上的需求是集群均可生成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 相关文章推荐
nodejs通过phantomjs实现下载网页
May 04 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
详解nodejs express下使用redis管理session
Apr 24 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs操作mysql实现增删改查的实例
May 28 NodeJs
Nodejs 复制文件/文件夹的方法
Aug 24 NodeJs
Windows下使用Nodejs运行js的方法
Sep 02 NodeJs
详解nodeJs文件系统(fs)与流(stream)
Jan 24 NodeJs
Nodejs调用Dll模块的方法
Sep 17 NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
NodeJs 实现简单WebSocket即时通讯的示例代码
Aug 05 #NodeJs
Nodejs监听日志文件的变化的过程解析
Aug 04 #NodeJs
nodejs对项目下所有空文件夹创建gitkeep的方法
Aug 02 #NodeJs
nodejs读取图片返回给浏览器显示
Jul 25 #NodeJs
关于NodeJS中的循环引用详解
Jul 23 #NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 #NodeJs
nodejs 递归拷贝、读取目录下所有文件和目录
Jul 18 #NodeJs
You might like
php横向重复区域显示二法
2008/09/25 PHP
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
基于Swoole实现PHP与websocket聊天室
2016/08/03 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
javascript import css实例代码
2008/07/18 Javascript
前端js实现文件的断点续传 后端PHP文件接收
2016/10/14 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
Js中使用正则表达式验证输入是否有特殊字符
2018/09/07 Javascript
基于vue实现移动端圆形旋钮插件效果
2018/11/28 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
vue路由权限校验功能的实现代码
2020/06/07 Javascript
Python 对象中的数据类型
2017/05/13 Python
轻量级的Web框架Flask 中模块化应用的实现
2017/09/11 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python 除法保留两位小数点的方法
2018/07/16 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Python continue语句实例用法
2020/02/06 Python
Python新手学习装饰器
2020/06/04 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
关于css兼容性问题及一些常见问题汇总
2016/05/03 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
2013/01/30 HTML / CSS
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
生产内勤岗位职责
2013/12/07 职场文书
奶茶店创业计划书范文
2014/01/17 职场文书
知识竞赛主持词
2014/03/26 职场文书
实习生辞职信范文
2015/03/02 职场文书
百年校庆感言
2015/08/01 职场文书
2019秋季运动会口号
2019/06/25 职场文书
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL
vue2的 router在使用过程中遇到的一些问题
2022/04/13 Vue.js