繁体   English   中英

如何在 Node.js 中以 Uint8List 格式将文件从 S3 发送到客户端?

[英]How do I pipe a file from S3 to the client in Uint8List format in Node.js?

我目前正在研究 Api 只是为了了解 Node.js,因为我目前正在学习它。

我成功地创建了一个将 mp3 文件上传到 s3 存储桶的路由,但是当我尝试从 S3 中获取 Uint8List 格式的文件时,我没有得到我想要的结果。 (Flutter 需要我发送一个 Uin8List,如果这不是一个好的解决方案我也可以在客户端将其转换为 Ui8List)

我能够创建一个可读的 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ,当 stream 接收到块时,它会将其记录到控制台中。 但是我不太确定如何将数据以缓冲区的形式发送回客户端,我只能将数据发送到一个大列表中,但为了提高效率,这当然不是最佳选择。

任何人都可以帮助我? 这是目前拥有的代码:

    var AWS = require('aws-sdk');
    
    AWS.config.update(
        {
            accessKeyId: AWS_ACCESS_KEY,
            secretAccessKey: AWS_SECRET_ACCESS_KEY,
            region: AWS_REGION
        }
    );
    
    var s3 = new AWS.S3();   

 

router.get('/assets/:fileKey', auth, async function (req, res, next) {
        try {
            const fileKey = req.params.fileKey;
    
            const options = {
                Bucket: AWS_BUCKET_NAME,
                Key: fileKey,
            };
    
            const chunks = [];
    
            const getAsBytes = new Promise((resolve, reject) => {
                const readStream = s3.getObject(options).createReadStream();
    
                readStream.on('data', (chunk) => {
                    // console.log('-------new data received--------')
                    // console.log(chunk);
                    chunks.push(chunk);
                    // res.write(chunk);
                });
    
                readStream.on('error', reject)
    
                readStream.on('end', resolve);
            }).catch((err) => next(err));
    
            await getAsBytes;
    
            res.write(Uint8Array.from(chunks));
            res.end();
    
    
        } catch (error) {
            next(error);
        }
    });

当我尝试 pipe 读取流时,我得到一个充满问号和奇怪符号的响应..

试试这个 -> 块实际上是一个缓冲区,所以你需要使用.toString() 将该缓冲区转换为实际数据

    var AWS = require('aws-sdk');
    
    AWS.config.update(
        {
            accessKeyId: AWS_ACCESS_KEY,
            secretAccessKey: AWS_SECRET_ACCESS_KEY,
            region: AWS_REGION
        }
    );
    
    var s3 = new AWS.S3();   

 

router.get('/assets/:fileKey', auth, async function (req, res, next) {
        try {
            const fileKey = req.params.fileKey;
    
            const options = {
                Bucket: AWS_BUCKET_NAME,
                Key: fileKey,
            };
    
            const chunks = [];
    
            const getAsBytes = new Promise((resolve, reject) => {
                const readStream = s3.getObject(options).createReadStream();
    
                readStream.on('data', (chunk) => {
                    // console.log('-------new data received--------')
                    // console.log(chunk);
                    chunks.push(chunk.toString());
                    // res.write(chunk);
                });
    
                readStream.on('error', reject)
    
                readStream.on('end', resolve);
            }).catch((err) => next(err));
    
            await getAsBytes;
    
            res.write(Uint8Array.from(chunks));
            res.end();
    
    
        } catch (error) {
            next(error);
        }
    });

暂无
暂无

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

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