将图像写入文件,通过 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-类型模块。
我确定我遗漏了一些明显的东西,但问题的要点是我从 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-类型模块。