GSUTIL签署了Url PUT到谷歌云存储失败

时间:2014-08-24 15:15:32

标签: jquery django google-cloud-storage gsutil

我希望网站的用户能够在不使用网络应用服务器资源的情况下将文件上传到google cloud storage,因此签名的网址似乎就是这样。

当用户选择要上传的文件时jqueryGET发送django请求以获取已签名的网址。使用gsutil signurl命令生成URL。 Django然后将已签名的网址返回给模板,并在提交时使用已签名的网址发送jquery PUT请求。

然而:

  • PUT请求失败并带有' SignatureDoesNotMatch'。
  • 使用此方法可以正常处理对存储对象的请求。

是否必须使用PUT请求发送必需的标头?

gsutil命令(假设用户选择了文件' map.html')...

gsutil signurl -p notasecret -m PUT -d 10m /path/to/.p12 gs://bucket_name/map.html

jquery PUT代码......

    $.ajax( {
  url: g_url,
  type: 'PUT',
  crossDomain: true,
  success: console.log('success'),
  error: function(XMLHttpRequest, textStatus, errorThrown){
    alert('status:' + XMLHttpRequest.status + ', status text: ' + XMLHttpRequest.statusText);
},
  data: file,
} );

g_url看起来像......

https://storage.googleapis.com/bucket_name/map.html?GoogleAccessId=__retracted__&Expires=1408889274&Signature=rDJAZQG4MIyMupy0M8HJ17r8rkEJcAbYSWpcq084SdzRh%2BnZavTfuWl4Q%2F6ytkSkN2c2%2B4b4pPRF5eWOEOL1InRxlB5pEBedPFZPpgDrRvR9tFybtH%2BkesKLhIZ3WjJ0utzAwhl%2BgAlQY6ulvO0Djib20zcG5fkHOigpRf1xBUk%3D

1 个答案:

答案 0 :(得分:1)

原来我的问题与CORS有关。为了使其在Django 1.6上运行,我必须执行以下操作:

PUTDELETE请求开始工作。我遇到的唯一其他问题是不兼容的内容标题。因此,我需要在签名的网址中和发送请求之前设置您的内容类型。

gsutil命令看起来像

gsutil signurl -p notasecret -m PUT -d 10m -c 'multipart/formdata; charset=UTF-8' /path/to/.p12 gs://bucket_name/map.html

将beforeSend添加到jquery请求

beforeSend: function (request){
request.setRequestHeader("Content-Type", 'multipart/formdata; charset=UTF-8')
;},