Chunked base64字符串,使用http nodejs逐个

时间:2017-08-21 14:07:15

标签: javascript node.js http base64

从我的API(nodejs),我正在访问第三方API(使用http)来下载文件。 该服务返回一个Base64字符串,切成小块,以便能够处理更大的文件。

是否可以向第三方服务发送多个http请求(循环?),将每个响应的内容发送到浏览器,直到第三方服务不再有任何响应为止?

我想这样做的原因是因为我不想消耗节点服务器上的大量内存。

我会把这些碎片放回浏览器中。

有关如何执行此操作的任何建议? 请参阅下面的我当前的代码。

var request = require('request');
 router.post('/getfiledata', function(req, res) {

        var fileid = req.body.fileid;
        var token = req.headers.authorization;

        getFileData(req, res, dbconfig, fileid, token, function(err, chunkOfFile) {
            if (err) {
                res.status(500).send({
                    status: 500,
                    message: err
                });
                return;
            }
            res.send(chunkOfFile);
        });
});

function getFileData(req, res, dbconfig, fileid, token, next) {

var url ="http://*ip*/service/rest/getfiledata";

var reqbody = {
    fileId: fileid
};

var options = {
    url: url,
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'Authorization': token
    },
    json: true,
    body: reqbody
};

/*SOME LOOP HERE TO GET EACH CHUNK AND SEND TO BROWSER*/
    request(options, function(err, resp, body) {

        if (err) {
            console.log(err);
            next(err, undefined);
            return;

        } else {
            next(undefined, body)
        };
    });

};

3 个答案:

答案 0 :(得分:0)

我认为您需要Socket.io将块推送到浏览器。

服务器:

socket.send("chunk", chunkOfFile)

客户:

let fullString = ""
socket.on("chunk", chunkOfFile => fullString += chunkOfFile )

像这样的东西

答案 1 :(得分:0)

您正在使用的request库允许将数据从一个源流式传输到另一个源。查看github上的文档。 以下是该页面的示例:

request
  .get(source)
  .on('response', function(response) {
    console.log(response.statusCode) // 200
    console.log(response.headers['content-type']) // 'image/png'
  })
  .pipe(request.put(destination))

您可以选择使用Nodejs中的http模块,因为它也实现了EventEmitter类。

答案 2 :(得分:0)

我最终从客户端做了一个递归循环。将http请求发送到我的API(节点),直到响应不再返回任何base64数据块。

谢谢你们!