簡體   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