5

我希望网站的用户能够在google cloud storage不使用 Web 应用服务器资源的情况下将文件上传到,因此签名的 url 似乎是可行的方法。

当用户选择要上传的文件时,会向签名的 urljquery发送GET请求django。url 是使用gsutil signurl命令生成的。Django然后将签名的 url 返回到模板,并在提交jquery PUT时使用签名的 url 发送请求。

然而:

  • PUT 请求因“SignatureDoesNotMatch”而失败。
  • 使用此方法对存储对象的 GET 请求可以正常工作。

是否有必须与 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
4

1 回答 1

1

原来我的问题与CORS有关。为了使它起作用Django 1.6,我必须执行以下操作:

有了这个PUTDELETE请求就开始工作了。我遇到的唯一其他问题是不兼容的内容标题。所以你我需要在签名的 url 和发送请求之前设置你的内容类型。

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')
;},
于 2014-09-08T12:20:50.177 回答