簡體   English   中英

如何在圖像上傳 PUT 請求期間設置/更新 AWS s3 object 元數據到簽名的 url?

[英]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.

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