3

我正在尝试使用 axios 访问谷歌云存储桶来上传文件:

我将存储桶中的 CORS 策略设置为:

[
    {
      "origin": ["http://localhost:8000", "localhost"],
      "responseHeader": ["Access-Control-Allow-Origin", "Content-Type"],
      "method": ["GET", "HEAD", "DELETE", "PUT", "POST"],
      "maxAgeSeconds": 3600
    }
]

然后我使用这个 gsutil 命令生成一个签名的 url:

gsutil signurl -m RESUMABLE -d 1h my-key.json gs://test-bucket/

最后我发送这个 axios POST 请求:

var startLink = "signed url from gsutil"
var data = {
  'Content-Length': 0,
  'Content-Type': 'text/plain',
  'x-goog-resumable': 'start',
  host: 'test-django-bucket.storage.googleapis.com',
};

axios.post(startLink, data)
  .then(function(response) {
    console.log(respone);
  });

我得到的结果是:

<?xml version='1.0'
encoding='UTF-8'?><Error><Code>InvalidPolicyDocument</Code><Message>The content of the form does not meet the conditions specified in the
policy document.</Message><Details>Missing policy</Details></Error>

我到底做错了什么?我正在按照此处的说明进行操作。


更新: 下面的@BrandonYarbrough 提供了一些关于我必须解决的问题才能在一段时间后让一切正常工作的注释:

首先axios请求出错了,应该是:

var data = {
  headers: {
    'content-type': 'text/plain',
    'x-goog-resumable': 'start',
  }
};
axios.post(startLink, {}, data)
  .then(function(response) {
    console.log(response);
  });

接下来我必须更新 gstuil 命令,如下所述:

gsutil signurl -m RESUMABLE -d 10h -c "text/plain" mykey.json gs://test-bucket
4

1 回答 1

2

您需要向 gsutil 提供另外两条信息以添加到签名中:Content-Type 和您正在创建的对象的名称。试试这个命令:

gsutil signurl -m RESUMABLE -d 1h -c "text/plain" my-key.json gs://test-bucket/object-name.txt

此外,gsutil 可能会输出类似“storage.googleapis.com/test-django-bucket/your_object?lotsOfUrlParameters”的 URL。如果您在指定“test-django-bucket.storage.googleapis.com”的主机标头时访问该 URL,那么您似乎实际上想要一个名为“test-django-bucket/your_object”的对象存储桶称为“test-django-bucket”。要么删除主机标头并直接点击 storage.googleapis.com,要么编辑 gsutil 返回的 URL 以删除“test-django-bucket”位。

此外,我认为您将标头作为数据发送。我认为 axios 标头是使用“标头”配置部分设置的。

于 2016-06-23T19:01:13.553 回答