nodejs записывает необработанные данные изображения в файл jpeg?

Я получаю данные из запроса на получение. Данные (в теле ответа) выглядят примерно так:

... ÿÀ���"�ÿÄ��������������ÿÄ�N��!1"AQa2q¡#BR±ð3brS²ÁÂÑá$ñCDTst¢³&45dÃÒÿÄ������������ÿÄ�-������!1A"Qa¡ðq±ÁÑ2áÿÚ���?�û." """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """R1º#ª¥7Jíî½M6îNö ]·!]=Fv­ß`7~qÆee²%·JokkZüCbìþ<ù{ã9öùË®´(%A,Ià�2I?t×bn6wÆù¥V 2SÀ><k5ºÙØ92EhÎçü¨/aÝ!ã|ñþ¥ñßT}U«¦ÒÚµ«xuÕfƳ KØ {ù{ð$·DúBMZÆcp}´R|Mä2ó8üg)·ùôfõ$zXiRÞü}óÆ>,êÚûíR5ý:\ .....

заголовки ответов выглядят так:

HTTP/1.1 200 OK
Content-Length: 26965
Access-Control-Allow-Origin: *
Content-Type: image/jpeg; charset=UTF-8
Date: Mon, 06 Feb 2012 21:14:21 GMT
Expires: Mon, 06 Feb 2012 22:14:21 GMT
Cache-Control: public, max-age=3600
Last-Modified: Fri, 13 Feb 2009 23:31:30 GMT
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Server: Dropta Server 1.0
X-Frame-Options: SAMEORIGIN
Connection: close

Я хочу получить содержимое тела, которое является данными моего изображения, и сохранить его в файле name.jpeg на сервере.

Как я могу это сделать? Я пытался использовать буферы в сочетании с модулем fs, но я немного потерялся.

Спасибо


person zumzum    schedule 06.02.2012    source источник


Ответы (2)


Вот пример загрузки http://upload.wikimedia.org/wikipedia/commons/1/15/Jagdschloss_Granitz_4.jpg в name.jpeg

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

var f=fs.createWriteStream('name.jpeg');

var options={
    host:'upload.wikimedia.org',
    port:80,
    path:'/wikipedia/commons/1/15/Jagdschloss_Granitz_4.jpg'
}

http.get(options,function(res){
    res.on('data', function (chunk) {
        f.write(chunk);
    });
    res.on('end',function(){
        f.end();
    });
});
person stewe    schedule 06.02.2012
comment
НЕВАЖНО. ОНО РАБОТАЕТ. Спасибо. - person zumzum; 07.02.2012
comment
Могу ли я открыть несколько потоков одновременно? Я хотел бы записать несколько изображений на диск одновременно, но когда я попытался поместить это в цикл, он немного сошел с ума и разбился. Поэтому, если я делаю изображение в то время, когда оно работает. Могу ли я запустить несколько потоков одновременно? - person zumzum; 07.02.2012
comment
Это не отвечает на вопрос. Как сохранить данные ответа напрямую, не создавая дополнительный запрос, если у вас уже есть тело/текст ответа? - person cs_brandt; 04.08.2014
comment
@stewe res.on('end' иногда может срабатывать до завершения f.write и, таким образом, преждевременно завершать writeStream до того, как изображение будет полностью записано. - person user1828780; 15.04.2016

Немного более короткая версия, в которой используется Stream.pipe:

var http = require('http'),
    fs = require('fs'),
    imgSource = 'http://upload.wikimedia.org/wikipedia/commons/1/15/Jagdschloss_Granitz_4.jpg';

http.get(imgSource, function(res) {
  res.pipe(fs.createWriteStream('wiki.jpg'));
});
person Laurent Perrin    schedule 02.08.2012
comment
для меня это лучший ответ, чем принятый - person Alexey; 24.03.2017