今天有人问ndoe.js如何下载正在写入中的文件的数据。
场景:
文件Server A,临时Server B,客户端 C。Server A 存有极大的文件,需要提供给多个客户端C下载。
为了节省Server A端的带宽和访问压力,做一个中间层即ServerB,Server B从Server A下载大文件到本地,为了节省时间和带宽,下载过程中,同时提供客户端来下载。
难点:
Server B从ServerA下载文件的同时要把正在保存中的文件提供给客户端下载,类似于提供给客户端断点续传的功能。
解决方案:
老外写了一个工具,上面的难点迎刃而解。https://github.com/felixge/node-growing-file
引用growing-file,实现上面的场景:
1、 fileServer.js == > 文件Server
var http = require('http'); var fs = require('fs'); var path = 'BigFile.iso'; var server = http.createServer(function(req, res) { var stream = fs.createReadStream(path); //读取流 stream.pipe(res); //读取流以pipe方式下发 }); server.listen(3000);
2、 tempServer.js == > 临时文件Sever,中间缓存层,提供多客户端下载
var http = require('http'); var fs = require('fs'); var sourceReadStream = fs.createWriteStream("BigFile.iso"); //写入流 var GrowingFile = require('growing-file'); //第三方模块,实时动态读取正在变动中的文件。 // from https://github.com/felixge/node-growing-file //这里模拟从文件Server下载大文件(随着进程启动,下载大文件以Stream pipe方式保存至本地)。 http.get("http://127.0.0.1:3000", function(res) { res.pipe(downloadFile); }); //有client请求时,读取本地正在执行写操作的文件,实时下发数据。 var server = http.createServer(function(req, res) { var file = GrowingFile.open('BigFile.iso'); //读取正在变动的文件(类似于断点续传)。 file.pipe(res); //pipe方式下发数据 }); server.listen(4000);
3、运行
node fileServer.js
node tempServer.js
浏览器访问: http: //127.0.0.1:4000。
时间: 2024-10-12 21:21:44