web-dev-qa-db-de.com

Image auf lokalen Server schreiben

Update

Die akzeptierte Antwort war gut für letztes Jahr, aber heute würde ich das Paket verwenden, das alle anderen verwenden: https://github.com/mikeal/request


Original

Ich versuche, das Logo von Google zu packen und es mit node.js. auf meinem Server zu speichern.

Das habe ich gerade und funktioniert nicht:

        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!');
                });
            });
        });

Wie kann ich das zum Laufen bringen?

56
Mark

Hier passiert ein paar Dinge:

  1. Ich nehme an, Sie benötigen fs/http und setzen die Variable dir. :)
  2. google.com leitet auf www.google.com um, so dass Sie den Körper der Weiterleitungsantwort speichern, nicht das Bild
  3. die Antwort wird gestreamt. Das bedeutet, dass das Datenereignis viele Male ausgelöst wird, nicht einmal. Sie müssen alle Brocken speichern und zusammenfügen, um den vollständigen Antwortkörper zu erhalten
  4. da Sie binäre Daten erhalten, müssen Sie die Kodierung für response und writeFile entsprechend festlegen (Standard ist utf8).

Das sollte funktionieren:

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.')
        })
    })

})
79
Ricardo Tomasi

Dieser Thread ist alt, aber ich wollte die gleichen Dinge mit dem Paket https://github.com/mikeal/request machen.

Hier ein Arbeitsbeispiel

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!");
  }); 
});
34
m4tm4t

Ich schlage vor, Sie verwenden http-request , damit auch Umleitungen verwaltet werden.

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);
    }
});
26
Drasill

Wie wäre es damit?

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.')
    })

})
5
yuqin

Ich habe eine einfachere Lösung mit fs.readFileSync(./my_local_image_path.jpg)

Dies ist für das Lesen von Bildern aus der Azure Cognitive Services Vision-API

const subscriptionKey = 'your_Azure_subscrition_key';
const uriBase = // **MUST change your location (mine is 'eastus')**
    'https://eastus.api.cognitive.Microsoft.com/vision/v2.0/analyze';

// Request parameters.
const params = {
    'visualFeatures': 'Categories,Description,Adult,Faces',
    'maxCandidates': '2',
    'details': 'Celebrities,Landmarks',
    'language': 'en'
};

const options = {
    uri: uriBase,
    qs: params,
    body: fs.readFileSync(./my_local_image_path.jpg),
    headers: {
        'Content-Type': 'application/octet-stream',
        'Ocp-Apim-Subscription-Key' : subscriptionKey
    }
};

request.post(options, (error, response, body) => {
if (error) {
    console.log('Error: ', error);
    return;
}
let jsonString = JSON.stringify(JSON.parse(body), null, '  ');
body = JSON.parse(body);
if (body.code) // err
{
    console.log("Azure: " + body.message)
}

console.log('Response\n' + jsonString);

Sauberste Methode zum lokalen Speichern von Bildern mit request

const request = require('request');
request('http://link/to/your/image/file.png').pipe(fs.createWriteStream('fileName.png'))

Wenn Sie Authentifizierungstoken hinzufügen in den Kopfzeilen hinzufügen müssen, gehen Sie folgendermaßen vor: 

const request = require('request');
request({
        url: 'http://link/to/your/image/file.png',
        headers: {
            "X-Token-Auth": TOKEN,
        }
    }).pipe(fs.createWriteStream('filename.png'))                    
0
BlackBeard