S3 上传和提供带有预签名 URL 的图像

Ham*_*bot 2 amazon-s3

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

这里我是怎么做的:

生成预签名 URL:

s3.getSignedUrl('putObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds
})
Run Code Online (Sandbox Code Playgroud)

使用 axios 上传文件:

const response = await axios.put(url, formElement.files[0])
Run Code Online (Sandbox Code Playgroud)

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

感谢您的帮助

tho*_*ace 6

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

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

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

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

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

  • 谢谢,在axios请求中做的很好,我可以动态设置内容类型:`const response = await axios.put(url, formElement.files[0], { headers: { 'Content-Type': formElement .files[0].type } })` (2认同)