我正在構建一個 MERN 堆疊應用程式,只有經過身份驗證的用戶才能上傳媒體檔案,然后對它們執行基本的讀取和洗掉操作。
我的應用程式以前使用 Firebase Storage 直接從客戶端將媒體上傳到 Google 的服務器。但是,現在我需要對客戶端進行身份驗證才能執行上傳,我正在尋找一種安全的替代解決方案。
從我有限的研究來看,常見的方法似乎是先將檔案上傳到服務器,然后從服務器發出單獨的請求,將檔案上傳到云存盤(例如 Google Cloud、AWS 等)或資料庫(GridFs在 MongoDB 中)?
實際上,將檔案上傳兩次對我來說似乎效率低下。我想這對于大檔案(例如 150 MB 的視頻)來說尤其繁重。
出于這個原因,實作經過身份驗證的(大)檔案上傳的最佳方法是什么?其次,我如何將上傳到云存盤或資料庫的進度發布回客戶端?
uj5u.com熱心網友回復:
您幾乎總是將客戶端直接上傳到您的服務器,因為這是您可以控制對云存盤的訪問的唯一方法,也是您無需將云憑據暴露給客戶端的唯一方法,這將是一個巨大的安全漏洞和您可以控制客戶做什么和不上傳什么的唯一方法。將這些憑據公開給客戶端將允許任何客戶端將他們想要的任何內容上傳到您的云服務,這當然不是您想要的。您必須能夠通過自己的服務器來控制它。
而且,您應該讓您的服務器檢查上傳器上的身份驗證,檢查正在上傳的資料型別,檢查正在上傳的資料的大小等......
可以在每個資料包到達時將傳入的上傳通過管道傳輸到云存盤,這樣您就不必在開始將其發送到云服務之前先在服務器上緩沖整個檔案,而 Abdennour 的回答顯示了一個示例S3 服務。當然,在這些情況下,您必須非常小心拒絕服務攻擊(例如 100TB 上傳),以免錯誤地允許向云存盤上傳超出您打算允許的大量內容。
實際上,將檔案上傳兩次對我來說似乎效率低下。
是的,從帶寬的角度來看,它的效率略低,但除非您的云存盤提供一些一次性憑證,否則您可以將其傳遞給客戶端(因此該憑證只能用于一次上傳)并且除非云存盤還允許您指定控制上傳所需的所有詳細資訊(最大大小、檔案型別等...),云存盤將強制執行此操作,然后唯一放置該邏輯的其他地方是您的服務器,它需要上傳通過您的服務器,這是實作的常用方式。
uj5u.com熱心網友回復:
您可以直接將請求通過管道傳輸到 Cloud Storage (AWS S3),而無需將其快取在服務器中。
它應該是這樣的:
import express from 'express';
import {S3} from 'aws-sdk';
const s3 = new S3();
const app = express();
app.post('/data', async (req, res) => {
var params = {
Body: req,
Bucket: "yourbucketname here",
Key: "exampleobject",
};
s3.upload(params, async (err, data) => {
if(err)
log.info(err);
else
log.info("success");
});
});
const server = app.listen(8081,async () => log.info("App listening") )
這里的關鍵是您的請求應該啟用多部分。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/377423.html
