Search code examples
httpnode.jsjpegfs

problems with sending jpg over http - node.js


I'm trying to write a simple http web server, that (among other features), can send the client a requested file.
Sending a regular text file/html file works as a charm. The problem is with sending image files.
Here is a part of my code (after parsing the MIME TYPE, and including fs node.js module):

if (MIMEtype == "image") {    
    console.log('IMAGE');  
    fs.readFile(path, "binary", function(err,data) {  
        console.log("Sending to user: ");  
        console.log('read the file!');  
        response.body = data;  
        response.end();  
    });  
} else {
    fs.readFile(path, "utf8", function(err,data) {
        response.body = data ;
        response.end() ;
    });
}    

Why all I'm getting is a blank page, upon opening http://localhost:<serverPort>/test.jpg?


Solution

  • Here's a complete example on how to send an image with Node.js in the simplest possible way (my example is a gif file, but it can be used with other file/images types):

    var http = require('http'),
        fs = require('fs'),
        util = require('util'),
        file_path = __dirname + '/web.gif'; 
        // the file is in the same folder with our app
    
    // create server on port 4000
    http.createServer(function(request, response) {
      fs.stat(file_path, function(error, stat) {
        var rs;
        // We specify the content-type and the content-length headers
        // important!
        response.writeHead(200, {
          'Content-Type' : 'image/gif',
          'Content-Length' : stat.size
        });
        rs = fs.createReadStream(file_path);
        // pump the file to the response
        util.pump(rs, response, function(err) {
          if(err) {
            throw err;
          }
        });
      });
    }).listen(4000);
    console.log('Listening on port 4000.');
    

    UPDATE:

    util.pump has been deprecated for a while now and you can just use streams to acomplish this:

    fs.createReadStream(filePath).pipe(req);