首页 > 解决方案 > S3 使用预签名 URL 上传和提供图像

问题描述

我正在尝试通过预签名的 url 将图像上传到我的 S3 存储桶。一切正常,除了当我点击该图像的公共 URL 时,浏览器会下载它而不是显示它。当我从 AWS 控制台上传相同的图像时,一切正常,图像显示在浏览器中。

我是怎么做的:

预签名 URL 的生成:

s3.getSignedUrl('putObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds
})

使用 axios 上传文件:

const response = await axios.put(url, formElement.files[0])

我是否应该在过程中的某处配置标头以告诉 S3 我正在上传的内容的 mime 类型或类似的东西?

感谢您的帮助

标签: amazon-s3

解决方案


有两个地方可以做到这一点。

如果您提前知道图像的类型,那么您可以ContentTypes3.getSignedUrl参数中显式设置。这是因为这些参数将被编码并与签名的 put 请求一起传递:getSignedUrl docs / putObject docs。例如:

s3.getSignedUrl('putObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds,
    ContentType: 'image/png'
});

或者,您可以Content-Type在 Axios 请求REST PUT docs上设置标头,例如:

const response = await axios.put(
  url,
  formElement.files[0],
  { headers: { 'Content-Type': formElement.files[0].type } });

推荐阅读