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
windows下安装nodejs及框架express
Aug 07 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
Nodejs高扩展性的模板引擎 functmpl简介
Feb 13 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
详解IWinter 一个路由转控制器的 Nodejs 库
Nov 15 NodeJs
nodejs调取微信收货地址的方法
Dec 20 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
nodejs简单读写excel内容的方法示例
Mar 16 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 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/08/10 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
jQuery ul标签下拉菜单演示代码
2010/12/11 Javascript
JS 控制小数位数的实现代码
2011/08/02 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
jQuery仿天猫实现超炫的加入购物车
2015/05/04 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
jQuery 1.9.1源码分析系列(十三)之位置大小操作
2015/12/02 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
详解JavaScript 为什么要有 Symbol 类型?
2019/04/03 Javascript
VUE路由动态加载实例代码讲解
2019/08/26 Javascript
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[15:57]教你分分钟做大人:斧王
2014/10/30 DOTA
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
python基于ID3思想的决策树
2018/01/03 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
使用numba对Python运算加速的方法
2018/10/15 Python
对python 命令的-u参数详解
2018/12/03 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
python 魔法函数实例及解析
2019/09/25 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
解决Python import docx出错DLL load failed的问题
2020/02/13 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
环保建议书作文
2014/03/12 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
保护环境建议书400字
2014/05/13 职场文书
开业庆典致辞
2015/08/01 职场文书
2016年寒假社会实践活动心得体会
2015/10/09 职场文书
党员观看《筑梦中国》心得体会
2016/01/18 职场文书
北京大学中文系教授推荐的10本小说
2019/08/08 职场文书
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL