Streaming file from S3 with Express including information on length and filetype
<p>Using the <code>aws-sdk</code> module and Express 4.13, it's possible to proxy a file from S3 a number of ways.</p>

<p>This callback version will return the file body as a buffer, plus other relevant headers like <code>Content-Length</code>:</p>

<pre><code>function(req,res){

  var s3 = new AWS.S3();

  s3.getObject({Bucket: myBucket, Key: myFile},function(err,data){

    if (err) {
      return res.status(500).send("Error!");
    }

    // Headers
    res.set("Content-Length",data.ContentLength)
       .set("Content-Type",data.ContentType);

    res.send(data.Body); // data.Body is a buffer

  });

}
</code></pre>

<p>The problem with this version is that you have to get the entire file before sending it, which is not great, especially if it's something large like a video.</p>

<p>This version will directly stream the file:</p>

<pre><code>function(req,res){

  var s3 = new AWS.S3();

  s3.getObject({Bucket: myBucket, Key: myFile})
    .createReadStream()
    .pipe(res);

}
</code></pre>

<p>But unlike the first one, it won't do anything about the headers, which a browser might need to properly handle the file.</p>

<p>Is there a way to get the best of both worlds, passing through the correct headers from S3 but sending the file as a stream?  It could be done by first making a <code>HEAD</code> request to S3 to get the metadata, but can it be done with one API call?</p>