我正在嘗試包含上傳到 AWS S3 并在 NextJS 應用程式中給出隨機/唯一名稱的檔案的名稱。
我可以從后端設定元資料,但我想將它從我的放置請求(實際上傳影像的位置)更新到簽名 URL。我該怎么做?
需要明確的是:我想在對簽名 URL 執行 PUT 請求時設定元資料。我目前在后端將它設定為“無”以避免出現禁止錯誤(這在 s3 中顯示為元資料)。這是否可以從我的 PUT 請求中更新元資料,我應該采取另一種方法嗎?謝謝!
// Backend code to get signed URL
async function handler(req, res) {
if (req.method === 'GET') {
const key = `content/${uuidv4()}.jpeg`;
s3.getSignedUrl(
'putObject',
{
Bucket: 'assets',
ContentType: 'image/jpeg',
Key: key,
Expires: 5 * 60,
Metadata: {
'file-name': "none",
}
},
(err, url) => res.send({ key, url })
);
}
// Frontend code
const [file, setFile] = useState(null);
const onFileUpload = async (e) => {
e.preventDefault();
const uploadConfig = await fetch('/api/upload');
const uploadURL = await uploadConfig.json();
await fetch(uploadURL.url, {
body: file,
method: 'PUT',
headers: {
'Content-Type': file.type,
'x-amz-meta-file-name': 'updated test name',
},
});
};
uj5u.com熱心網友回復:
使用預先簽名的 url 是不可能做到的。當您創建預簽名 url 時,所有屬性都已預填充。上傳檔案時,您無法更改它們。您唯一可以控制的是物件的資料。存盤桶、鍵和元資料(以及 put_object 的所有其他引數)是預定義的。generate_presigned_post 也是這種情況。所有欄位均已預填充。
這是有道理的,因為后端授予權限并需要決定這些權限。此外,實作將更加復雜,因為預簽名的 url 支持所有具有不同引數的客戶端方法。
您可以做到的唯一方法是按需生成網址。首先根據客戶端選擇的名稱生成預簽名的url,然后進行上傳。每個檔案都需要兩次往返。一個到您的服務器,用于生成 url,一個到 S3 用于上傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360498.html
標籤:javascript 亚马逊网络服务 亚马逊-s3 下一个.js
