簡體   English   中英

從 AWS S3 到 Node.js 服務器的文件檢索,然后到 React 客戶端

[英]File retrieval from AWS S3 to Node.js server, and then to React client

我需要使用 Express.js 從 Node.js 檢索單個文件。 為此,我安裝了aws-sdk以及@aws-sdk/client-s3 我可以使用這個簡單的端點成功地獲取文件:

const app = express(),
      { S3Client, GetObjectCommand } = require('@aws-sdk/client-s3'),
      s3 = new S3Client({ region: process.env.AWS_REGION });

app.get('/file/:filePath', async (req,res) => {
  const path_to_file = req.params.filePath;

  try {
    const data = await s3.send(new GetObjectCommand({ Bucket: process.env.AWS_BUCKET, Key: path_to_file }));
    console.log("Success", data);
  } catch (err) {
    console.log("Error", err);
  }
});

...但我不知道如何將data正確返回到 React.js 前端,以便可以進一步下載文件。 我試圖查找文檔,但它看起來對我來說太亂了,我什至無法得到 function 返回的內容。 .toString()方法沒有幫助,因為它只是返回 `"[object Object]" 而沒有別的。

在 React 上,我使用了一個庫file-saver ,它與 blob 一起使用,並使用用戶定義的文件名提供它們以供下載。

節點 v15.8.0、React v16.4.0、@aws-sdk/client-s3 v3.9.0、文件保護程序 v2.0.5

感謝您的提示和建議。 非常感謝任何幫助。

通常來自 S3 的數據作為緩沖區返回。 文件內容是響應中Body參數的一部分。 您可能正在根 object 上執行toString

您需要在 body 參數上使用.toString()以使其成為字符串。

這是一些可能適用於用例的示例代碼

// Note: I am not using a different style of import
const AWS = require("aws-sdk")
const s3 = new AWS.S3()

const Bucket = "my-bucket"

async getObject(key){
 const data = await s3.getObject({ Bucket, key}).promise()
 if (data.Body) {return data.Body.toString("utf-8") } else { return undefined}
}

要在express中返回它,您可以將其添加到您的路線中,並在獲得最終數據后將其傳回。

res.end(data));

在 React 中使用它應該與從任何其他 REST API 獲取值相同。

我使用了Ravi的答案,但導致在前端顯示圖像 object 時出現問題。

這很好用:

  const data = await s3.send(new GetObjectCommand({ Bucket: process.env.AWS_BUCKET, Key: path_to_file }));
  data.Body.pipe(res);

暫無
暫無

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

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