nodejs 怎么下载远程文件并该名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nodejs 怎么下载远程文件并该名称相关的知识,希望对你有一定的参考价值。

参考技术A nodejs对文件的读写还是相当灵活的,可以根据不同的场景来选择不同的方法。

一.直接操作文件
最简单的两个fs.readFile和fs.writeFile
  举例:这个程序的功能是将一个比较大json格式的文件转换成你想自己要格式的文件。
var fs = require('fs');
fs.readFile('./json.json',function(err,data)
if(err) throw err;

var jsonObj = JSON.parse(data);
var space = ' ';
var newLine = '\n';
var chunks = [];
var length = 0;

for(var i=0,size=jsonObj.length;i<size;i++)
var one = jsonObj[i];
//what value you want
var value1 = one['value1'];
var value2 = one['value2'];
....
var value = value1 +space+value2+space+.....+newLine;
var buffer = new Buffer(value);
chunks.push(buffer);
length += buffer.length;


var resultBuffer = new Buffer(length);
for(var i=0,size=chunks.length,pos=0;i<size;i++)
chunks[i].copy(resultBuffer,pos);
pos += chunks[i].length;


fs.writeFile('./resut.text',resultBuffer,function(err)
if(err) throw err;
console.log('has finished');
);

);

它的原理是将文件数据一次性全部读入内存,优点就是接下来都是在内存的操作,速度会很快。但缺点也很明显,就是当文件非常大时,会造成内存溢出。
二. 使用文件流
   2.1 读取文件,api相见:fs.createReadSream 和 fs.createWriterStream
以下代码实现的功能就是通过文件流来实现图片的复制:
var fs = require('fs');
var rOption =
flags : 'r',
encoding : null,
mode : 0666


var wOption =
flags: 'a',
encoding: null,
mode: 0666


var fileReadStream = fs.createReadStream('./myjpg.jpg',rOption);
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg',wOption);

fileReadStream.on('data',function(data)
fileWriteStream.write(data);

);

fileReadStream.on('end',function()
console.log('readStream end');
fileWriteStream.end();
);
参考技术B nodejs对文件的读写还是相当灵活的,可以根据不同的场景来选择不同的方法。

一.直接操作文件
最简单的两个fs.readFile和fs.writeFile
  举例:这个程序的功能是将一个比较大json格式的文件转换成你想自己要格式的文件。
var fs = require('fs');
fs.readFile('./json.json',function(err,data)
if(err) throw err;

var jsonObj = JSON.parse(data);
var space = ' ';
var newLine = '\n';
var chunks = [];
var length = 0;

for(var i=0,size=jsonObj.length;i<size;i++)
var one = jsonObj[i];
//what value you want
var value1 = one['value1'];
var value2 = one['value2'];
....
var value = value1 +space+value2+space+.....+newLine;
var buffer = new Buffer(value);
chunks.push(buffer);
length += buffer.length;


var resultBuffer = new Buffer(length);
for(var i=0,size=chunks.length,pos=0;i<size;i++)
chunks[i].copy(resultBuffer,pos);
pos += chunks[i].length;


fs.writeFile('./resut.text',resultBuffer,function(err)
if(err) throw err;
console.log('has finished');
);

);

它的原理是将文件数据一次性全部读入内存,优点就是接下来都是在内存的操作,速度会很快。但缺点也很明显,就是当文件非常大时,会造成内存溢出。
二. 使用文件流
   2.1 读取文件,api相见:fs.createReadSream 和 fs.createWriterStream
以下代码实现的功能就是通过文件流来实现图片的复制:
var fs = require('fs');
var rOption =
flags : 'r',
encoding : null,
mode : 0666


var wOption =
flags: 'a',
encoding: null,
mode: 0666


var fileReadStream = fs.createReadStream('./myjpg.jpg',rOption);
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg',wOption);

fileReadStream.on('data',function(data)
fileWriteStream.write(data);

);

fileReadStream.on('end',function()
console.log('readStream end');
fileWriteStream.end();
);

这里再补充在流中非常有用的一个函数:pipe,它以用来把当前的可读流和另外一个可写流连接起来。可读流中的数据会被自动写入到可写流中。使用起来非常方便,依然实现上例中的功能:
var fs = require('fs');

var fileReadStream = fs.createReadStream('./myjpg.jpg');
var fileWriteStream = fs.createWriteStream('./new_myjpg.jpg');
fileReadStream.pipe(fileWriteStream);

fileWriteStream.on('close',function()
console.log('copy over');
);

用这个函数可以轻松地实现一个静态资源服务器:
var http = require("http");
var fs = require("fs"),
var path = require("path"),
var url = require("url");

var server = http.createServer(function(req, res)
var pathname = url.parse(req.url).pathname;
console.log(pathname);
var filepath = path.join("./tmp", "wwwroot", pathname);
console.log(filepath);
var stream = fs.createReadStream(filepath, flags : "r", encoding : null);
stream.on("error", function()
res.writeHead(404);
res.end();
);
stream.pipe(res);
);
server.on("error", function(error)
console.log(error);
);
server.listen(8088,function()
console.log('server listen on 8088');
);

c++ rpc调用nodejs

rpc

远程过程调用,就是调用远程服务器上的方法,返回结果,将需要运行的函数或者进程放到远程服务器上去执行,降低本地服务的能耗。

安装thrift

windows下面直接下载可执行文件就行了
产生cpp文件
./thrift-0.16.0.exe --gen cpp camera.idl.txt
产生nodejs文件
./thrift-0.16.0.exe --gen js:node camera.idl.txt
这样nodejs 的定义和c++的定义声明都自动产生了

nodejs 端

先要安装thrift
npm install thrift --save

使用nodejs编写服务端

const thrift = require('thrift');
const cService = require('./gen-nodejs/CameraService.js');

const cameras = ;
const server = thrift.createServer(cService, 
 addCamera: function (camera, result) 
   cameras[camera.id] = camera
   console.log("camera add:", camera, " current:", camera)
   result(null)
 ,
 getCamera: function (id, result) 
   console.log("get:", id)
   result(null, cameras[id])
 
);

server.listen(5600);
console.log('server start at 5600');

使用c++ 写一个客户端

#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TTransportUtils.h>

#pragma comment(lib, “libthrift.lib”)
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;

#pragma comment(lib,“libthrift.lib”)//链接库文件

int main(int argc, char** argv) 
int port = 5600;
boost::shared_ptr socket(new TSocket(127.0.0.1, port));
boost::shared_ptr transport(new TBufferedTransport(socket));
boost::shared_ptr protocol(new TBinaryProtocol(transport));
Camera came;
came.id ="1001";
came.name ="D1 hik";
came.ssrc ="13200001";
try 
	transport->open();

	client.addCamera(came);
    camera came = client.getCamera();
	transport->close();

catch (TException& tx) 
	printf("ERROR:%s\\n", tx.what());

getchar();
return 0;

以上客户端代码为伪代码,读者自行根据生成的代码去做就行,nodejs和c++建立通道后就可以进行通信,如果不需要远程过程调用,只是消息通信,可以使用zeromq

使用zeromq 和buttonrpc

zeromq使用订阅发布的方式,比较简单

建立zeromq的buttonrpc

buttonrpc建立在zeromq基础之上

#include "buttonrpc.hpp"
#include <unordered_map>
struct camera

string camera;
string name;
uint32_t ssrc;

 unordered_map<uint32_t, camera*> g_maps;
string camera_find(uint32_t  cameraid)
	return g_maps[cameraid];

 
int main()

	buttonrpc server;
	server.as_server(6000);
 
	server.bind("camera_find", camera_find);
	server.run();
 
	return 0;

#include <iostream>
#include "buttonrpc.hpp"
 
int main()

	buttonrpc client;
	client.as_client("127.0.0.1", 6000);
	camera a = client.call<int>("camera_find", 2, 3);
	std::cout << "camera id result: " << a.id << std::endl;
	return 0;

nodejs和buttonrpc

必须使用二进制方式进行通信,可以抓包分析,nodejs端需要写一些代码,因为没有像thrift一样自动生成

nodejs 单独启动rpc进程

在nodejs里面使用单独一个进程启动rpc服务

let cp = require('child_process');
let worker = cp.fork('./rpc_thrift.js');
 
 
// 用于监听子进程传来的信息
worker.on('message', ( data ) =>
    console.log('receive the data: ', data);
    if(data ==  "exit")
       ...
)
//向子进程发送信息
worker.send('this is server ');

setTimeout(()=>
    process.send(name: '1111111');
,1000)

// 监听父进程的消息
process.on('message', (data) => 
    console.log('recv', data);
)

以上是关于nodejs 怎么下载远程文件并该名称的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 远程连接windows 上的MongoDB

vpn未进行远程连接,因为远程访问服务器的名称问题没有解决怎么解决,

Node.js-nodejs可否读取远程文件到本地 有没有像php file

怎么把远程服务器上的文件下载到本地电脑上

c++ rpc调用nodejs

c++ rpc调用nodejs