I have an MP4 file sitting in an AWS S3 bucket.
The view code is like this:
<video width="300px" controls>
<source src="/getS3File/<full-s3-filename-here>" type="video/mp4">
</video>
and the backend Node.JS code is like this:
exports.gets3file = function(req, res, next) {
var env = require("./env.js");
var knox = require('knox');
var s3filename = req.params.id;
var submissionFileId = "https://TestS3File.amazonws.com/" + s3filename;
var s3Client = knox.createClient({
key: aws.accessKey,
secret: aws.secretKey,
bucket: "testbucket"
});
s3Client.get(submissionFileId)
.on('response', function(res) {
res.setHeader('Content-Length', res.headers['content-length']);
res.setHeader('Content-Type', res.headers['content-type']);
if (req.fresh) {
res.statusCode = 304;
res.end();
return;
}
if (req.method === 'HEAD') {
res.statusCode = 200;
res.end();
return;
}
res.pipe(req);
});
res.end();
};
When i execute this code, I see this error in the node log:
Error: socket hang up
at createHangUpError (http.js:1472:15)
at CleartextStream.socketOnEnd [as onend] (http.js:1568:23)
at CleartextStream.onCryptoStreamEnd (tls.js:322:24)
at CleartextStream.g (events.js:180:16)
at CleartextStream.emit (events.js:117:20)
at _stream_readable.js:943:16
at process._tickCallback (node.js:419:13)
at process._tickFromSpinner (node.js:394:15
Any ideas re: what I might be doing wrong ?
Thanks
There's a few things wrong here: You're piping to the wrong stream, you're ending your response immediately before the file starts streaming, and you're shadowing the real res
with the res
from the S3 request. Try something like this instead:
exports.gets3file = function(req, res, next) {
var env = require("./env.js");
var knox = require('knox');
var s3filename = req.params.id;
var submissionFileId = "https://TestS3File.amazonws.com/" + s3filename;
var s3Client = knox.createClient({
key: aws.accessKey,
secret: aws.secretKey,
bucket: "testbucket"
});
s3Client.get(submissionFileId)
.on('response', function(s3res) {
res.setHeader('Content-Length', s3res.headers['content-length']);
res.setHeader('Content-Type', s3res.headers['content-type']);
if (req.fresh) {
res.statusCode = 304;
res.end();
return;
}
if (req.method === 'HEAD') {
res.statusCode = 200;
res.end();
return;
}
s3res.pipe(res);
}).end();
};
You may want to also check s3res.statusCode
too in case the file doesn't exist (404) for example, so that you can send the appropriate status code back to the original client.