将图像写入文件,通过 Node 中的 HTTP 请求接收

Writing an image to file, received over an HTTP request in Node

我确定我遗漏了一些明显的东西,但问题的要点是我从 Mapbox 调用中接收到 PNG,目的是将其写入文件系统并将其提供给客户端。我已经成功地中继了呼叫,收到了原始数据的响应并写入了一个文件。问题是无论我采取什么路径,我的文件最终都会被截断,而且我已经用尽了我找到的绕过这个主题的答案。我已经将原始响应转储到日志中,它很可靠,但我制作的任何文件往往都是关于一大块不可读数据的价值。

这是我目前得到的文件制作代码。在几次失败且相对无果的迭代之后,我尝试将此缓冲区移动作为最后的手段。任何帮助将不胜感激。

module.exports = function(req, res, cb) {
    var cartography = function() {
        return https.get({
            hostname: 'api.mapbox.com',
            path: '/v4/mapbox.wheatpaste/' + req.body[0] + ',' + req.body[1] + ',6/750x350.png?access_token=' + process.env.MAPBOX_API
        }, function(res) {
            var body = '';
            res.on('data', function(chunk) {
                body += chunk;
            });
            res.on('end', function() {
                var mapPath = 'map' + req.body[0] + req.body[1] + '.png';
                var map = new Buffer(body, 'base64');
                fs.writeFile(__dirname + '/client/images/maps/' + mapPath, map, 'base64', function(err) {
                    if (err) throw err;
                    cb(mapPath);
                })
            })
        });
    };
    cartography();
};

可以在更紧凑的子例程中重写您的代码:

    const fs = require('fs');
    const https = require('https');

    https.get(url, (response)=> { //request itself
        if(response) {
            let imageName = 'image.png'; // for this purpose I usually use crypto
            response.pipe( //pipe response to a write stream (file)
                fs.createWriteStream( //create write stream
                    './public/' + imageName //create a file with name image.png
                )
            );
            return imageName; //if public folder is set as default in app.js
        } else {
            return false;
        }
    })

您可以从 url 获取原始名称和扩展名,但使用加密生成新名称并获取文件扩展名更安全,就像我从 url 中说的那样,或者使用 read-chunk 和 file-类型模块。