简体   繁体   English

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

[英]How to output image from s3.getObject(params).createReadStream() to HTML using node js

I have been trying to upload an image to s3 using multer and downloading it to a local path successfully using the below code. 我一直在尝试使用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');  
            }  
    });    
}); 

However, i am not sure, how do i send the response back to HTML with parameters like Headers, Body, Content-Type, status code and status message based on success/failure of image getting downloaded. 但是,我不确定,如何根据下载图像的成功与否,使用标头,正文,内容类型,状态代码和状态消息之类的参数将响应发送回HTML。
Kindly help and let me know if i am going in a correct path. 请帮助,让我知道我走的路是否正确。

  1. You will need to fully wait for the event emitter from S3 to finish completely before sending a response to the client. 将响应发送到客户端之前,您将需要完全等待S3中的事件发射器完全完成。 NodeJS 7: EventEmitter + await/async NodeJS 7:EventEmitter +等待/异步
  2. Once you have the data, you will need to transform the readable stream into a Buffer and determine the ContentType from the file you downloaded and use: res.send(Buffer) : http://expressjs.com/en/api.html#res.send 拥有数据后,您需要将可读流转换为Buffer 从下载并使用的文件中确定ContentTyperes.send(Buffer)http : res.send(Buffer) 重新发送

Also see Node.js: How to read a stream into a buffer? 另请参阅Node.js:如何将流读入缓冲区?

I know, it has been quite a long time to answer this question. 我知道,回答这个问题已经很长时间了。 But thought, this would help someone. 但以为,这会帮助某人。 I was able to solve the issue with below code given: 我可以通过以下代码解决此问题:

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM