ブラウザから事前署名された URL 経由で保護された S3 への直接アップロード時にコンテンツ タイプを制限するにはどうすればよいですか?

概要

フロントエンドがファイルのコンテンツタイプを送信する必要があるアップロード署名付きURLを生成しようとしています。 友人がこのコンテンツタイプを送信せず、params のコンテンツタイプを削除すると、すべてが正常に動作することがわかります。 しかし、バケットでは、オブジェクトのタイプは空白の空白であり、タイプは記載されていません。 それで、ダウンロード中、またはpresignedURLを介してオブジェクトを取得中に、取得するとエラーが発生すると思いました しかし、それでもすべてがうまく機能します 私が考えられる唯一のことは、検証のためにバックエンドでそのコンテンツタイプを使用し、アップロードを画像ビデオなどの特定のコンテンツタイプに制限できることですか? 誰か実際の使用例を説明してください ありがとう。

app.post("/api/posts/pre", async (req, res) => {
  const bucketName = 'usman.test.bucket';
  const { fileName, fileType } = req.body; // Get file name and file type from form data
// /frontend is responsible for providing the fileType information, while the backend handles the generation of the fileName and the pre-signed URL. This separation of concerns ensures that the application is more modular and maintainable.
// /If the frontend doesn't provide the fileType, the backend can assume a default file type, such as application/octet-stream, which is a generic binary file type.
  try {
    const params = {
      Bucket: bucketName,
      Key: fileName,
      ContentType: fileType,
    };

    const command = new PutObjectCommand(params);
    const signedUrl = await getSignedUrl(s3, command, { expiresIn: 3600 });

    res.json({ presignedUrl: signedUrl });
  } catch (error) {
    console.error('Error generating pre-signed URL:', error);
    res.status(500).send('Error generating pre-signed URL');
  }
});

解決策

https://medium.com/@Games24x7Tech/a-complete-guide-to-s3-file-upload-using-pre-signed-post-urls-9cb2d6cfc0ab の記事の途中で説明されている createPresignedPost を使用する必要があります。 PutObjectCommand() の代わりに。この記事は実際には非常に不明確ですが、バックエンドで (秘密の AWS 認証情報を使用して) createPresignedPost() を呼び出し、URL をフロントエンドに渡し、フロントエンドに署名付き URL に対して通常の POST を実行させる必要があると思います。

誤解された質問に基づく古い回答:

S3 からファイルをブラウザで直接開く場合、コンテンツ タイプとエンコーディングが正しい場合、より適切に動作します。

出典:実体験。これらのヘッダーなしで保存された .json.gz オブジェクトがいくつかあり、URL を開こうとすると、画面に json が表示されず、代わりに「ダウンロード」または「名前を付けて保存」ダイアログが表示されます。

おそらく、.jpg 画像があり、ユーザーにファイルとしてダウンロードさせるのではなく、その画像を Web ブラウザーに表示したい場合にも、同じことが起こるでしょう。