如何使用节点js将s3.getObject(params).createReadStream()中的图像输出到HTML

时间:2018-04-08 09:46:00

标签: node.js express amazon-s3 filesystems

我一直在尝试使用multer将图像上传到s3并使用以下代码将其成功下载到本地路径。

routes.post('/updownload', upload.array('file'), function (req, res) {   
    var params = {  
        Bucket: "*******",  
        Key: "image1.jpeg"  
       };  
var file = fs.createWriteStream('./uploads/file4.jpeg');                     

 s3.getObject(params)  
.createReadStream()  
.on('error', function (err) {                   
         console.log('Error reading file: ' + err.message);
         file.end();
        })                 
        .pipe(file)  
        .on('error', function (err) {   
            err = true;  
            console.log('Error writing file:' + error.message);  
            file.end();   
        })   
        .on('finish', function (err) {                        
            file.end();   
            if (!err) {   
                console.log('Successfully downloaded file from S3');  
            }  
    });    
}); 

但是,我不确定,如何根据图像下载的成功/失败,使用Headers,Body,Content-Type,状态代码和状态消息等参数将响应发送回HTML。
如果我走的是正确的道路,请帮助并告诉我。

2 个答案:

答案 0 :(得分:0)

  1. 在向客户端发送响应之前,您需要完全等待S3中的事件发射器完全完成。 NodeJS 7: EventEmitter + await/async
  2. 获得数据后,您需要将可读流转换为Buffer 从您下载的文件中确定ContentType并使用:{{1 }:http://expressjs.com/en/api.html#res.send
  3. 另见Node.js: How to read a stream into a buffer?

答案 1 :(得分:0)

我知道,回答这个问题已经很长时间了。但以为,这会帮助某人。我可以通过以下代码解决此问题:

const params = {
      Bucket: '*********',
      Key: image1.jpeg,
    };

    res.set('Content-Type', 'image/jpeg');
    res.set('Content-Type', 'image/jpg');
    res.set('Content-Type', 'image/png');


    const stream = s3.getObject(params).createReadStream();
    stream.on('error', err => {
      logger.log({ level: 'error', messsage: 'stream error', error: `${err}` });
    });
    stream.pipe(res);