web-dev-qa-db-fra.com

Ecriture d'une image sur un serveur local

Mettre à jour

La réponse acceptée était bonne pour l’année dernière, mais aujourd’hui, j’utiliserais le paquet que tout le monde utilise: https://github.com/mikeal/request


Original

J'essaie de récupérer le logo de Google et de l'enregistrer sur mon serveur avec node.js.

C'est ce que j'ai maintenant et ça ne marche pas:

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

Comment puis-je obtenir ce travail?

56
Mark

Quelques choses qui se passent ici:

  1. Je suppose que vous avez besoin de fs/http et que vous définissez la variable dir :)
  2. google.com redirige vers www.google.com, de sorte que vous enregistrez le corps de la réponse de redirection, pas l'image
  3. la réponse est diffusée. cela signifie que l'événement 'data' se déclenche plusieurs fois, pas une seule fois. vous devez enregistrer et joindre tous les morceaux pour obtenir le corps de réponse complet
  4. puisque vous obtenez des données binaires, vous devez définir le codage en conséquence pour la réponse et writeFile (la valeur par défaut est utf8)

Cela devrait fonctionner:

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

Ce fil est ancien mais je voulais faire la même chose avec le paquet https://github.com/mikeal/request .

Voici un exemple de travail

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

Je vous suggère d'utiliser http-request , de sorte que même les redirections soient gérées.

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

Que dis-tu de ça?

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

J'ai une solution plus facile en utilisant fs.readFileSync(./my_local_image_path.jpg)

Ceci concerne la lecture d'images à partir de API Azure Cognitive Services Vision

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);

Le plus propre moyen de sauvegarder l'image localement en utilisant request

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

Si vous avez besoin de ajouter un jeton d'authentification dans les en-têtes, procédez comme suit: 

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