Загрузка изображения через модуль запроса узла повреждена - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь загрузить изображение через модуль запроса npm и сохранить его с помощью fs.writeFile, однако файл поврежден при сохранении на диске, что проверено с помощью imagemagick identify команда.

const fs = require('fs');
const path = require('path');
const request = require('request');

const brandLogoUrl  = 'https://example.net/logo.png';
const filename      = path.basename(brandLogoUrl);
const brandLogoPath = `./${filename}`;

request(brandLogoUrl, (error, rsp, body) =>  {
        fs.writeFile(brandLogoPath, body, 'binary', (err) => {
            console.log('brand logo saved');
        });
    });
});

Когда я проверяю сохраненный файл с помощью identify, результат:

определить: неправильный заголовок изображения `logo.png '@ ошибка / png.c / ReadPNGImage / 3940.

Однако, если я скачаю тот же URL-адрес с помощью wget и проверим его с помощью identify, результат будет

logo.png PNG 283x109 283x109 + 0 + 0 8-битный sRGB 19KB 0.000u 0: 00.000

JS кажется довольно простым, но, похоже, я что-то упускаю. Вы можете это заметить?

EDIT

Я попробовал модуль https (на основе этого поста ), и он работает

var fs = require('fs');
var https = require('https');
//Node.js Function to save image from External URL.
var url = 'https://example.net/logo.png';
var file = fs.createWriteStream('./logo.png');
https.get(url, function(response) {
    response.pipe(file);
});

1 Ответ

1 голос
/ 25 июня 2019

Что вам не хватает, так это кодировка ответа. Когда вы делаете запрос с использованием этой библиотеки, по умолчанию она кодируется как строка (utf-8). Согласно документации модуля request , вы должны передать encoding: null для правильного извлечения двоичных данных.

Итак, ваш код должен выглядеть так:

request({ url: brandLogoUrl, encoding: null }, (error, rsp, body) =>  {
  fs.writeFile(brandLogoPath, body, 'binary', (err) => {
    console.log('brand logo saved');
  });
});

Это также причина, по которой модуль https работал хорошо - он просто передает необработанные данные без какой-либо кодировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...