![](/img/trans.png)
[英]AWS S3 update image using pre-signed URL (Axios-PUT Request)
[英]How do I set/update AWS s3 object metadata during image upload PUT request to signed url?
我正在嘗試包含上傳到 AWS S3 並在 NextJS 應用程序中賦予隨機/唯一名稱的文件的名稱。
我可以從后端設置元數據,但我想將其從我的 put 請求(實際上傳圖像的位置)更新為簽名的 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',
},
});
};
使用預簽名的 url 是不可能的。 當您創建預簽名 url 時,所有屬性都已預填充。 上傳文件時,您無法更改它們。 您唯一可以控制的是對象的數據。 存儲桶、密鑰和元數據(以及 put_object 的所有其他參數)是預定義的。 generate_presigned_post 也是如此。 所有字段均已預先填寫。
這是有道理的,因為后端授予權限並需要決定這些權限。 此外,實現會更加復雜,因為預簽名的 url 支持所有具有不同參數的客戶端方法。
您可以做到這一點的唯一方法是按需生成 url。 首先根據客戶端選擇的名稱生成預簽名的url,然后進行上傳。 每個文件都需要兩次往返。 一個到您的服務器,用於生成 url,一個到 S3 用於上傳。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.