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 相关文章推荐
使用forever管理nodejs应用教程
Jun 03 NodeJs
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
详解nodejs与javascript中的aes加密
May 22 NodeJs
NodeJs使用Mysql模块实现事务处理实例
May 31 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
NodeJs搭建本地服务器之使用手机访问的实例讲解
May 12 NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 NodeJs
NodeJs生成sitemap站点地图的方法示例
Jun 11 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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面向对象全攻略 (三)特殊的引用“$this”的使用
2009/09/30 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
2013/06/25 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
由document.body和document.documentElement想到的
2009/04/13 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
jquery设置按钮停顿3秒不可用
2014/03/07 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
jQuery模拟select实现下拉菜单功能
2016/06/20 Javascript
让微信小程序支持ES6中Promise特性的方法详解
2017/06/13 Javascript
DVA框架统一处理所有页面的loading状态
2017/08/25 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
webpack构建换肤功能的思路详解
2017/11/27 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
Node使用Selenium进行前端自动化操作的代码实现
2019/10/10 Javascript
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
[02:10]DOTA2 TI10勇士令状玩法及不朽Ⅰ展示:焕新世界,如你所期
2020/05/29 DOTA
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
对python中的装包与解包实例详解
2019/08/24 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
Python selenium实现断言3种方法解析
2020/09/08 Python
pip install命令安装扩展库整理
2021/03/02 Python
linux面试题参考答案(2)
2015/12/06 面试题
Java如何支持I18N?
2016/10/31 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
艺术节主持词
2014/04/02 职场文书
终止合同协议书
2014/04/17 职场文书
个人委托书范本
2014/09/13 职场文书
流动人口婚育证明范本
2014/09/26 职场文书
万里长城导游词
2015/01/30 职场文书
送达通知书
2015/04/25 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书