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写的一个简单项目打包工具
May 11 NodeJs
NodeJs的优势和适合开发的程序
Aug 14 NodeJs
Nodejs下DNS缓存问题浅析
Nov 16 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
简单实现nodejs上传功能
Jan 14 NodeJs
nodejs使用express创建一个简单web应用
Mar 31 NodeJs
nodejs个人博客开发第三步 载入页面
Apr 12 NodeJs
NodeJs中express框架的send()方法简介
Jun 20 NodeJs
使用nodejs+express实现简单的文件上传功能
Dec 27 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
nodejs中express入门和基础知识点学习
Sep 13 NodeJs
nodejs+koa2 实现模仿springMVC框架
Oct 21 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实现网站插件机制的方法
2009/11/10 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
解析PHP无限级分类方法及代码
2013/06/21 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
HTML5附件拖拽上传drop & google.gears实现代码
2011/04/28 Javascript
5个javascript的数字格式化函数分享
2011/12/07 Javascript
利用Javascript判断操作系统的类型实现不同操作系统下的兼容性
2013/01/29 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
浅谈js的setInterval事件
2014/12/05 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
javascript控制层显示或隐藏的方法
2015/07/22 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
2017/02/27 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python的re模块正则表达式操作
2016/05/25 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
Python Celery多队列配置代码实例
2019/11/22 Python
python和php哪个容易学
2020/06/19 Python
python 两种方法删除空文件夹
2020/09/29 Python
基于Jquery和Css3代码制作可以缩放的搜索框
2015/11/19 HTML / CSS
HTML5 解析规则分析
2009/08/14 HTML / CSS
End Clothing美国站:英国男士潮牌商城
2018/04/20 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
Windows和Linux动态库应用异同
2016/04/17 面试题
某同学的自我鉴定范文
2013/12/26 职场文书
岗位聘任书范文
2014/03/29 职场文书
部门2015年度工作总结
2015/04/29 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python