网络环境

  1. 系统有三个电脑:A和B在一个网段M,C单独在另一个网段N
  2. MN彼此不能访问,只有B能通过特殊方式访问C,反之不通
  3. AB可以双向访问
  4. A是前端服务器,BC都是后端服务器,安装有NodeJS+Express

技术需求

现在有这样的需求:
用户需要通过A给B发命令,让其传输B上的某个文件夹给C

分析问题

按照前面的描述,BC都是没有前端页面的,只有后台API服务,因此不能用常规的input标签在前端上传,只能在代码里传文件到C去,同时C要写接收服务.传输的过程中还需要压缩以节约时间.

代码

后端的B需要安装几个库,其中adm-zip form-data multer是核心的库

npm install express cors  adm-zip form-data

首先是B,先创建一个接收A发来的启动传输命令.这里用了form-data库,很方便的就可以直接上传

var express = require('express')
const admZip = require("adm-zip");
const fs = require('fs');
const FormData = require('form-data');
const path = require('path');
const cors = require('cors')
const bodyParser = require('body-parser')
const port = 8700var app = express()
app.use(cors())
app.use(bodyParser.urlencoded({extended: false
}));
app.use(bodyParser.json());
app.use(express.static('public'))// 接收A传过来的启动传输命令,key是要传输的文件夹名称
app.get('/upload', (req, res) => {let key = req.query.keyif(key === undefined || key === null)return res.send({code:201,message:'错误'})let zipName = `${key}.zip`    let zipPath = `D:/Code/nodejs/send-file-test/${key}.zip`let zip = new admZip();// add local file 测试随便打包几个文件,没按Key来zip.addLocalFile("D:/Code/nodejs/send-file-test/package.json");    zip.addLocalFile("D:/Code/nodejs/send-file-test/package-lock.json");zip.writeZip(zipPath); let check = setInterval(()=>{if (fs.existsSync(zipPath)){clearInterval (check)let form = new FormData();form.append("file", fs.createReadStream(zipPath));// 向C提交文件数据form.submit('http://10.33.200.1:8700/api/upload', function(err, res2) {res2.resume();return res.send({code:200,message:'成功'})});            }},1000)})app.listen(port, () => {console.log(`服务运行中 http://localhost:${port}`)})

后端的B需要安装几个库

npm install express cors  adm-zip multer

然后是C端写接收服务,和接收普通POST服务一样,使用multer库更加方便

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })
const admZip = require("adm-zip");
const axios = require('axios');
const fs = require('fs');
const path = require('path');
const cors = require('cors')
const bodyParser = require('body-parser')
const port = 8700var app = express()
app.use(cors())
app.use(bodyParser.urlencoded({extended: false
}));
app.use(bodyParser.json());
app.use(express.static('public'))app.post('/api/upload', upload.single('file'),  function (req, res, next) {const destName = path.join(req.file.destination,req.file.originalname)const destPath = destName.substring(0,destName.length-4)if(!fs.existsSync(destPath))  fs.mkdirSync(destPath);fs.renameSync(req.file.path,destName)const zip = new admZip( destName );zip.extractAllTo(destPath, true);fs.unlinkSync(destName)return res.send({status:'done'})
})app.listen(port, () => {console.log(`服务运行中 http://localhost:${port}`)
})

各种运行服务后,在A端用postman发起调用https://192.168.1.2:8700/upload?key=123456556

NodeJS代码直接发送文件及接收相关推荐

  1. 02 Qt发送文件和接收

    借助上一篇文章的内容,在原有的TCP通讯的基础上,在服务端和客户端之间发送文件. 首先把在客户端加一个用于显示发送进度的进度条,在服务器端把原有的发送和关闭换为选择和发送,如下图所示 在客户端连接服务 ...

  2. PC微信逆向:分析微信发送文件call

    文章目录 发送文件call的结构体参数分析 组合数据call的分析 定位发送文件的call 接上一篇文章,PCXX逆向:发送与接收消息的分析与代码实现:https://blog.csdn.net/qq ...

  3. Springboot接受文件与发送文件

    ` 文章目录 前言 一.前端上传文件,Springboot接受并保存在某个路径 1.引入库 2.前端核心代码(发送文件) 3.Controller类 4.注意事项 二.Springboot发送文件,前 ...

  4. 把客户端文件发送到服务器,客户端向服务器发送文件

    客户端向服务器发送文件 内容精选 换一换 Microsoft SQL Server提供的发布与订阅功能,利用复制技术来实现数据同步,可以通过其提供的发布与订阅功能实现数据的读写分离和线下线上数据同步. ...

  5. flask和socket结合使用实现客户端向服务端发送文件

    文章目录 1.实验效果 2.文件结构说明 3.操作步骤 4.代码下载 5.服务端文件 6.客户端文件 7.前端文件 1.实验效果 成功发送文件和接收文件 2.文件结构说明 3.操作步骤 (1)首先运行 ...

  6. Python实现微信发送文件实例

    新建Python文件:wx_file.py,代码如下 # -*- coding: utf-8 -*- # @Author : CxiuM # @Time : 2023-07-06 10:12 # @N ...

  7. 阿里旺旺发送文件以保存服务器,使用阿里旺旺收发文件

    您可能感兴趣的话题: 阿里旺旺 核心提示:我们都知道阿里旺旺是网络贸易在线沟通的好工具,不仅如此,阿里旺旺还提供了文件传送的功能,您可以及时便捷的将客户需要的报价单等传送给客户. 有三种方法可以将本地 ...

  8. Qt写的可以发送文件夹、图片、文件、文本内容的TCPServer、UDPServer

    Qt写的可以发送文件夹.图片.文件.文本内容的TCPServer.UDPServer TCP发送文件夹 TCP 客户端接收文件夹 UDP发送文件 UDP接收文件

  9. python怎么发送代码文件_python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

最新文章

  1. SAP HUM 如何看哪些HU还在923包装区尚未上架?
  2. TC264信标组 双车组 资源规划 库函数示例
  3. 手把手教你Chrome浏览器安装Postman(含下载云盘链接)【转载】
  4. JAXB自定义绑定– Java.util.Date / Spring 3序列化
  5. java mac pos_pos终端mac国密(sm4)算法(java实现)
  6. Kinect for Windows SDK开发初体验(二)操作Camera
  7. 人工智能产业链深度透析-技术层
  8. [转载] 使用Python在ArcGIS中编程杂谈
  9. Eclipse切换IDE界面语言
  10. BUUCTF笔记之Misc系列部分WriteUp(一)
  11. 汉服php素材,【福利】汉服裁剪制作图——收录大全
  12. linux 复制文件加后缀,linux shell 取文件名后缀
  13. GSM Hack(手机信号劫持)
  14. 硬盘结构及raid磁盘阵列
  15. iPhone预计移除SIM卡槽,用户需通过eSIM激活网络
  16. Solidworks2014在win8下安装无权限
  17. 正宇丨有钱,把日子过好;没钱,把心情过好
  18. 吊打 CLIP 平均10个点,Meta 多模态通用模型 FLAVA真香啊
  19. 录音棚的基本搭建//2021-1-31
  20. 好用的工具介绍之——免费pdf编辑及英文pdf翻译成中文

热门文章

  1. Python 爬虫:喜马拉雅FM音频(这个还能不载,试了一下其它下载工具都不行了)
  2. 被不良商家欺骗怎么投诉,启中教育有办法
  3. (附源码)小程序 音乐播放器小程序 毕业设计 170900
  4. 百度李彦宏:我从未说过“百度All in AI” 更多资源还是会在搜索上
  5. 2021年互联网影视峰会!原创报道,Adobe国际认证助力摄影前途
  6. 王心凌火了,于是我用Python写一个天天酷跑
  7. iMazing怎么导出应用程序的存档
  8. [转载]钟茂森博士出家,净空老法师现场见证出家盛况_huadingjin_新浪博客
  9. 无线鼠标很费电池,用有线比较好
  10. 输入学生期中成绩、期末成绩、平时成绩,按30%、50%、20%计算学生的综合成绩