AWS S3 GET 预签名 url 间歇性失败并出现 CORS

ALe*_*Lex 5 java amazon-s3 amazon-web-services cors reactjs

我正在使用 java 为存储在 s3 中的图像生成预签名 url

  public String generateDownloadLink(String bucketName, String responseContentDisposition,
      String key, int days) {

    GetObjectRequest objectRequest =
        GetObjectRequest.builder()
            .bucket(bucketName)
            .responseContentDisposition(responseContentDisposition)
            .key(key).build();

    GetObjectPresignRequest preSignRequest =
        GetObjectPresignRequest.builder()
            .signatureDuration(Duration.ofDays(days))
            .getObjectRequest(objectRequest)
            .build();

    PresignedGetObjectRequest presignedRequest = this.s3Presigner.presignGetObject(preSignRequest);

    return presignedRequest.url().toString();
Run Code Online (Sandbox Code Playgroud)

然后,FE(反应)使用图像标签加载图像,如下图所示。当全屏打开时,该模态a还有一个下载按钮 ->标签元素。如果按下下载按钮,由于 CORS 错误,它不会下载任何内容。

这篇文章解释了原因,尽管该解决方案不适用于我的情况。

另外,这种情况会间歇性地发生,我无法弄清楚这些情况下有什么不同。有时我可以看到缩略图(又名库执行初始 GET 来加载图像并显示它),并且在打开模式后,我可以下载图像(又名库使用标签执行另一个获取a)。

在此输入图像描述

存储桶 CORS 配置

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "PUT",
            "GET",
            "HEAD"
        ],
        "AllowedOrigins": [
            "http://localhost:3000",
            "https://<my-host>"
        ],
        "ExposeHeaders": [
            "ETag"
        ],
        "MaxAgeSeconds": 3000
    }
Run Code Online (Sandbox Code Playgroud)

编辑:我无法添加,crossorigin="anonymous"因为我无权访问 img 元素

gri*_*edj 0

尝试添加到CORS 配置OPTIONS列表中。AllowedMethods从浏览器发出的 CORS 预检请求(在“真实”请求之前)使用OPTIONShttp 方法,因此需要允许。