【问题标题】:Google Cloud Storage: No 'Access-Control-Allow-Origin' header is present on the requested resourceGoogle Cloud Storage:请求的资源上不存在“Access-Control-Allow-Origin”标头
【发布时间】:2020-11-17 08:49:13
【问题描述】:

我想将文件上传到 Google Cloud Storage。我使用 go 创建了签名的 url。使用签名的 url 和 axios,我在这里编写代码。

      const options = {
        headers: {
          'Access-Control-Allow-Origin': '*',
        },
      }

      this.$axios
        .put(signed_url, file, options)
        .then((res) => {
          console.log(res)
        })
        .catch((err) => {
          console.log(err)
        })
    })

但是在执行 axios put 之后返回 Access to XMLHttpRequest at 'https://storage.googleapis.com....' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 的响应。我的 backet cors 设置在这里。

❯ gsutil cors get gs://<backet-name>
[{"maxAgeSeconds": 86400, "method": ["*"], "origin": ["*"], "responseHeader": ["*"]}]

【问题讨论】:

    标签: google-cloud-platform cors


    【解决方案1】:

    在这里聚会迟到了,但发布这个让我难倒了好几个小时。我遇到了同样的问题,我通过在客户端和生成签名 URL 的函数中显式设置方法和内容类型来解决它。

    服务器端代码:

        bucket := "YOUR_BUCKET_NAME_HERE"
        filename := "someuniquefilename-uuid.png"
        method := "PUT"
        expires := time.Now().Add(time.Hour * 2) // allow 2 hours for large uploads
        ctp := "image/png"  // can also pass from client
    
        url, err := storage.SignedURL(bucket, filename, &storage.SignedURLOptions{
            GoogleAccessID: "YOUR_SERVICE_ACCOUNT_HERE@appspot.gserviceaccount.com",
            PrivateKey:     []byte("-----BEGIN PRIVATE KEY-----\n  get this from your google service account \n-----END PRIVATE KEY-----\n"),
            Method:         method,
            Expires:        expires,
            ContentType:    ctp,
        })
    

    客户端代码:

        // get file data
        var file = $('#' + pfx + "File").prop("files")[0];
    
        $.ajax({
            method: "PUT",
            contentType: file.type, 
            processData: false,
            dataType: "xml",
            crossDomain: true,
            data: file,
            url: sURL,
            // headers: {'Access-Control-Allow-Origin':'*'},
            beforeSend: function (request){
                request.setRequestHeader("Access-Control-Allow-Origin", '*');
            },      
            xhr        : function ()
            {
                var jqXHR = null;
                if ( window.ActiveXObject )
                {
                    jqXHR = new window.ActiveXObject( "Microsoft.XMLHTTP" );
                }
                else
                {
                    jqXHR = new window.XMLHttpRequest();
                }
    
                //Upload progress
                jqXHR.upload.addEventListener( "progress", function ( evt )
                {
                    if ( evt.lengthComputable )
                    {
                        var percentComplete = Math.round( (evt.loaded * 100) / evt.total );
                        //Do something with upload progress
                        $('#' + pfx + "Progress").val(percentComplete); 
                        console.log( 'Uploaded percent', percentComplete );
                    }
                }, false );
    
                return jqXHR;
            },  
            error: function (response, status, e) {
                alert('Oops something went wrong');
            },      
            success: function(data) {
                alert(data);
            },
            complete: function() {
                var a = 1;
            },
        
        });
    
        return false;
    

    (并确保你的 CORS 设置在你的谷歌存储桶上)

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 2014-07-28
      • 2014-01-19
      • 2013-12-07
      相关资源
      最近更新 更多