将图像写入本地服务器

Mar*_*ark 59 http-get node.js

更新

接受的答案对去年有好处,但今天我会使用其他人使用的包:https: //github.com/mikeal/request


原版的

我正试图抓住谷歌的徽标并使用node.js将其保存到我的服务器

这就是我现在所做的并且不起作用:

        var options = {
            host: 'google.com',
            port: 80,
            path: '/images/logos/ps_logo2.png'
        };

        var request = http.get(options);

        request.on('response', function (res) {
            res.on('data', function (chunk) {
                fs.writeFile(dir+'image.png', chunk, function (err) {
                    if (err) throw err;
                    console.log('It\'s saved!');
                });
            });
        });
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这个工作?

Ric*_*asi 83

这里发生了一些事情:

  1. 我假设你需要fs/http,并设置dir变量:)
  2. google.com会重定向到www.google.com,因此您要保存重定向响应的正文,而不是图像
  3. 响应是流式传输的.这意味着'数据'事件会多次触发,而不是一次.你必须保存并加入所有的块以获得完整的响应体
  4. 因为你正在获取二进制数据,你必须在响应和writeFile上相应地设置编码(默认为utf8)

这应该工作:

var http = require('http')
  , fs = require('fs')
  , options

options = {
    host: 'www.google.com'
  , port: 80
  , path: '/images/logos/ps_logo2.png'
}

var request = http.get(options, function(res){
    var imagedata = ''
    res.setEncoding('binary')

    res.on('data', function(chunk){
        imagedata += chunk
    })

    res.on('end', function(){
        fs.writeFile('logo.png', imagedata, 'binary', function(err){
            if (err) throw err
            console.log('File saved.')
        })
    })

})
Run Code Online (Sandbox Code Playgroud)

  • 你怎么不使用冒号? (13认同)
  • @jcdavid傻npm风格指南约定. (8认同)
  • 这是一个糟糕的建议.永远不要`.setEncoding('binary')`并使用`res.pipe(fs.createWriteStream())`而不是缓冲内存中的整个图像.如果你太懒,你可以使用这个库:https://github.com/stream-utils/save-to (6认同)
  • @jcdavid http://blog.izs.me/post/2353458699/an-open-letter-to-javascript-leaders-regarding (2认同)

m4t*_*m4t 37

这个帖子很旧但我想用https://github.com/mikeal/request 包做同样的事情.

这是一个有效的例子

var fs      = require('fs');
var request = require('request');
// Or with cookies
// var request = require('request').defaults({jar: true});

request.get({url: 'https://someurl/somefile.torrent', encoding: 'binary'}, function (err, response, body) {
  fs.writeFile("/tmp/test.torrent", body, 'binary', function(err) {
    if(err)
      console.log(err);
    else
      console.log("The file was saved!");
  }); 
});
Run Code Online (Sandbox Code Playgroud)

  • 文档现在说要将二进制的编码设置为null,否则它被认为是utf8:https://github.com/request/request"encoding - 要在响应数据的setEncoding上使用的编码.如果为null,则返回正文作为缓冲区.其他任何东西(包括默认值undefined)将作为编码参数传递给toString()(这意味着默认情况下这实际上是utf8).(注意:如果你期望二进制数据,你应该设置编码:null .)" (5认同)

Dra*_*ill 26

我建议你使用http-request,以便管理甚至重定向.

var http = require('http-request');
var options = {url: 'http://localhost/foo.pdf'};
http.get(options, '/path/to/foo.pdf', function (error, result) {
    if (error) {
        console.error(error);
    } else {
        console.log('File downloaded at: ' + result.file);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 不得不承认,这与http下载可以得到的一样直接. (2认同)

yuq*_*qin 5

这个怎么样?

var http = require('http'), 
fs = require('fs'), 
options;

options = {
    host: 'www.google.com' , 
    port: 80,
    path: '/images/logos/ps_logo2.png'
}

var request = http.get(options, function(res){

//var imagedata = ''
//res.setEncoding('binary')

var chunks = [];

res.on('data', function(chunk){

    //imagedata += chunk
    chunks.push(chunk)

})

res.on('end', function(){

    //fs.writeFile('logo.png', imagedata, 'binary', function(err){

    var buffer = Buffer.concat(chunks)
    fs.writeFile('logo.png', buffer, function(err){
        if (err) throw err
        console.log('File saved.')
    })

})
Run Code Online (Sandbox Code Playgroud)