簡體   English   中英

直接下載存儲在S3 bucket中的文件到React客戶端,而不是通過Node.js服務器

[英]Download file stored in S3 bucket directly to React client, instead of passing through Node.js server

這篇來自 heroku的文章表明可以在一個人的節點服務器中簽署請求並將大文件直接從客戶端上傳到 S3,但我一直無法找到將大文件直接從 S3下載到客戶端的類似解決方案.

有關我在下面嘗試做的事情的更多信息:


我正在使用托管在 Heroku 上的 Node.js 服務器構建 React web 應用程序。用戶創建和編輯音頻文件,然后存儲在 S3 存儲桶中。

在接下來的會話中,音頻必須再次從 S3 存儲桶加載到用戶的瀏覽器中。 為此,web 應用程序向 node.js 服務器發送請求,然后服務器檢索文件並將其發送到具有以下端點的客戶端:

// LOAD AUDIO
router.get("/getaudio/:userEmail/:projectId/:sectionId", async (req, res) => {    

    //create key from user/project/section IDs
    const userEmail = req.params.userEmail;
    const projectId = req.params.projectId;
    const sectionId = req.params.sectionId;
    
    const key = `${userEmail}/${projectId}/${sectionId}.webm`;

    const params = {
        Key: key,
        Bucket: s3BucketName
    }

    s3.getObject(params, function (error, data) {
        if (error) {
            console.error(error);
        }
        res.send(data);
    });
    
});

這里的問題是音頻文件可能非常大(長達 1.5 小時)。 將這些文件加載到 Node.js 服務器,然后將它們發送到客戶端感覺非常低效,並且可能導致我的 Heroku dyno 上不必要的負載,以及用戶非常長的等待時間。

但是,我不想在我的客戶端中直接使用 AWS SDK(完全切斷服務器),因為有人告訴我這是不好的做法,並且會暴露您的環境變量。

有沒有辦法將大文件從我的 s3 存儲桶中安全可靠地直接下載到 React 客戶端?

您可以在您的 node.js 服務器上生成一個預簽名的 URL 以授予對 s3 object 的訪問權限,將該 URL 發送到您的 React 應用程序並直接從 React 應用程序下載該文件。

需要注意的是,預簽名的 URL 默認在 15 分鍾后過期。 因此,如果您需要增加過期時間,您可以通過傳遞Expires參數來指定您的 URL 保持多長時間(以秒為單位)有效。

您的 node.js 處理程序可能如下所示:

router.get("/getaudio/:userEmail/:projectId/:sectionId", async (req, res, next) => {

    //create key from user/project/section IDs
    const userEmail = req.params.userEmail;
    const projectId = req.params.projectId;
    const sectionId = req.params.sectionId;

    const key = `${userEmail}/${projectId}/${sectionId}.webm`;

    const params = {
        Key: key,
        Bucket: s3BucketName
    }

    s3.getSignedUrl('getObject', params, function (err, url) {
        if (err) {
            console.error(err)
            next(err);
        } else {
            res.json({ url })
        }
    })

});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM