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学习笔记之Connect中间件模块(一)
Jan 27 NodeJs
Nodejs学习笔记之入门篇
Apr 16 NodeJs
Nodejs 搭建简单的Web服务器详解及实例
Nov 30 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
nodejs入门教程一:概念与用法简介
Apr 24 NodeJs
用nodejs实现json和jsonp服务的方法
Aug 25 NodeJs
NodeJS简单实现WebSocket功能示例
Feb 10 NodeJs
nodeJs实现基于连接池连接mysql的方法示例
Feb 10 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
ubuntu系统下使用pm2设置nodejs开机自启动的方法
May 12 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
php print EOF实现方法
2009/05/21 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
jquery模拟LCD 时钟的html文件源代码
2014/06/16 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
JS判断客服QQ号在线还是离线状态的方法
2015/01/13 Javascript
AngularJS中watch监听用法分析
2016/11/04 Javascript
Bootstrap CSS布局之按钮
2016/12/17 Javascript
jQuery插件HighCharts实现的2D面积图效果示例【附demo源码下载】
2017/03/15 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
JS实现textarea通过换行或者回车把多行数字分割成数组并且去掉数组中空的值
2018/10/29 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
js实现拖动缓动效果
2020/01/13 Javascript
解决vue-photo-preview 异步图片放大失效的问题
2020/07/29 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
Python 代码性能优化技巧分享
2012/08/07 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
python实现电脑自动关机
2018/06/20 Python
python实现几种归一化方法(Normalization Method)
2019/07/31 Python
Python3 assert断言实现原理解析
2020/03/02 Python
python GUI模拟实现计算器
2020/06/22 Python
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
2015/07/30 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
影视后期实训报告
2014/11/05 职场文书
拾金不昧表扬信
2015/01/16 职场文书
家庭贫困证明
2015/06/16 职场文书