nodejs write raw image data to jpeg file?

15,532

Solution 1

Here's an example, which downloads http://upload.wikimedia.org/wikipedia/commons/1/15/Jagdschloss_Granitz_4.jpg to 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();
    });
});

Solution 2

A slightly shorter version, which uses 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'));
});
Share:
15,532
zumzum
Author by

zumzum

Updated on June 19, 2022

Comments

  • zumzum
    zumzum almost 2 years

    I am getting data from a get request. The data (in the body of the response) looks something like this:

    ... ÿÀ���"�ÿÄ��������������ÿÄ�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ý:\ .....
    

    the response headers look like this:

    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
    

    I want to get the body content which is my image data and save it to a name.jpeg file on the server.

    How can I do that? I tried using buffers combined with the fs module, but I am kind of lost.

    Thanks

  • zumzum
    zumzum over 12 years
    NEVER MIND. IT WORKS. Thanks.
  • zumzum
    zumzum over 12 years
    So can I have multiple streams open at the same time? I would like to write multiple images to disk at the same time, but when I tried to put this in a loop it went a bit crazy and crashed. So if I do an image at the time it works. Can I have multiple streams running at the same time?
  • cs_brandt
    cs_brandt almost 10 years
    This doesnt answer the question. How do save the response data directly without creating an additional request if you already have the response body/text?
  • user1828780
    user1828780 about 8 years
    @stewe res.on('end' can sometimes fire before f.write is finished and thus prematurely end writeStream before the image is fully written
  • Alexey
    Alexey about 7 years
    for me this is a better answer than the one accepted