如何使用node.js加载和保存图像?

如何使用node.js加载和保存图像?,node.js,Node.js,A有以下代码: var http = require('http'); var fs = require('fs'); var data; var options = { host: 'nodejs.org', port: 80, path: '/images/logo.png', method: 'GET' }; var req = http.request(options, function(res) { res.on('data', function (chunk) {

A有以下代码:

var http = require('http');
var fs = require('fs');
var data;
var options = {
  host: 'nodejs.org',
  port: 80,
  path: '/images/logo.png',
  method: 'GET'
};
var req = http.request(options, function(res) {
  res.on('data', function (chunk) {
    data += chunk;
  });
  res.on('end', function () {
    fs.writeFile('1.png', data, function (err) {
      if(err) 
        console.log('NNOOOOOOOOOOOO');
    });
  });
});
req.on('error', function(e) {
  console.log('error: ' + e.message);
});
req.end();
此脚本创建文件1.png并保存获取的数据,但我无法在Windows中打开它


请提供帮助。

您需要设置正确的编码

res.setEncoding('binary')


fs.writeFile('1.png', data, {encoding: 'binary'}, function(err){
您可以这样做:

var req = http.request(options, function(res) {
  var file = fs.createWriteStream('1.png');
  res.pipe(file);
});
req.on('error', function(e) {
  console.log('error: ' + e.message);
});
req.end();
更新 我检查了你的代码,发现了两件事:

  • 数据
    未正确初始化
  • 使用setEncoding将响应视为二进制。不需要在
    writeFile
  • 所以只需在
    http.request
    callback的开头添加这两行:

      res.setEncoding("binary") ;
      var data='';
    

    那么您的代码应该可以正常工作。

    Windows仍然无法打开此文件。我目前无法测试此文件,这就是为什么我提供的代码中存在一个小错误的原因。writeFile将对象作为选项,而不仅仅是字符串。仍然无法测试此功能,但这可能是问题所在。是否有此功能的更新?什么以及如何为保存图像提供编码?@Sable添加了解释,只是说-使用此解决方案修复代码后-文件无法打开,因为nodejs.org/images/logo.png返回“301永久移动”并将标题保存到文件中。