nodejs node listobjects getobject from example aws node.js amazon-web-services amazon-s3 download disk

node.js - node - s3 sdk aws



NodeJS ¿Cómo descargo un archivo al disco desde un cubo aws s3? (3)

Mi meta:

Muestra un cuadro de diálogo que le pide al usuario que guarde un archivo que se está descargando de aws.

Mi problema:

Actualmente estoy usando awssum-amazon-s3 para crear un flujo de descarga. Sin embargo, solo logré guardar el archivo en mi servidor o transmitirlo a la línea de comandos ... Como puede ver en mi código, mi último intento fue intentar configurar manualmente los encabezados de disposición de contenido que fallaron. ¿No puedo usar res.download () ya que los encabezados ya se han establecido?

¿Cómo puedo lograr mi objetivo?

Mi código para el nodo:

app.post(''/dls/:dlKey'', function(req, res, next){ // download the file via aws s3 here var dlKey = req.param(''dlKey''); Dl.findOne({key:dlKey}, function(err, dl){ if (err) return next(err); var files = dl.dlFile; var options = { BucketName : ''xxxx'', ObjectName : files, }; s3.GetObject(options, { stream : true }, function(err, data) { // stream this file to stdout fmt.sep(); data.Headers[''Content-Disposition''] = ''attachment''; console.log(data.Headers); data.Stream.pipe(fs.createWriteStream(''test.pdf'')); data.Stream.on(''end'', function() { console.log(''File Downloaded!''); }); }); }); res.end(''Successful Download Post!''); });

Mi código para angular:

$scope.dlComplete = function (dl) { $scope.procDownload = true; $http({ method: ''POST'', url: ''/dls/'' + dl.dlKey }).success(function(data/*, status, headers, config*/) { console.log(data); $location.path(''/#!/success''); }).error(function(/*data, status, headers, config*/) { console.log(''File download failed!''); }); };

El propósito de este código es permitir que los usuarios utilicen una clave generada para descargar un archivo una vez.


Este código me funcionó con la biblioteca más reciente:

var s3 = new AWS.S3(); var s3Params = { Bucket: ''your bucket'', Key: ''path/to/the/file.ext'' }; s3.getObject(s3Params, function(err, res) { if (err === null) { res.attachment(''file.ext''); // or whatever your logic needs res.send(data.Body); } else { res.status(500).send(err); } });


Este es el código completo que usa la transmisión en la última versión de aws-sdk

var express = require(''express''); var app = express(); var fs = require(''fs''); app.get(''/'', function(req, res, next){ res.send(''You did not say the magic word''); }); app.get(''/s3Proxy'', function(req, res, next){ // download the file via aws s3 here var fileKey = req.query[''fileKey'']; console.log(''Trying to download file'', fileKey); var AWS = require(''aws-sdk''); AWS.config.update( { accessKeyId: "....", secretAccessKey: "...", region: ''ap-southeast-1'' } ); var s3 = new AWS.S3(); var options = { Bucket : ''/bucket-url'', Key : fileKey, }; res.attachment(fileKey); var fileStream = s3.getObject(options).createReadStream(); fileStream.pipe(res); }); var server = app.listen(3000, function () { var host = server.address().address; var port = server.address().port; console.log(''S3 Proxy app listening at http://%s:%s'', host, port); });


Ya ha pensado qué es lo más importante para resolver su problema: puede canalizar la secuencia de archivos proveniente de S3 a cualquier secuencia de escritura, ya sea una secuencia de archivos ... ¡o la secuencia de respuesta que se enviará al cliente!

s3.GetObject(options, { stream : true }, function(err, data) { res.attachment(''test.pdf''); data.Stream.pipe(res); });

Tenga en cuenta el uso de res.attachment que establecerá los encabezados correctos. También puede consultar esta respuesta con respecto a las transmisiones y S3.