mha*_*ger 5 django jquery google-cloud-storage gsutil
我希望网站的用户能够在google cloud storage不使用网络应用服务器资源的情况下上传文件,因此签名的网址似乎就是这样.
当用户选择要上载的文件时,会jquery向签名的URL 发送GET请求django.使用gsutil signurl命令生成URL .Django然后将签名的URL返回给模板,并在提交jquery PUT请求时使用签名的URL发送.
然而:
是否必须使用PUT请求发送必需的标头?
gsutil命令(假设用户选择文件'map.html')...
gsutil signurl -p notasecret -m PUT -d 10m /path/to/.p12 gs://bucket_name/map.html
Run Code Online (Sandbox Code Playgroud)
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,
} );
Run Code Online (Sandbox Code Playgroud)
g_url看起来像......
https://storage.googleapis.com/bucket_name/map.html?GoogleAccessId=__retracted__&Expires=1408889274&Signature=rDJAZQG4MIyMupy0M8HJ17r8rkEJcAbYSWpcq084SdzRh%2BnZavTfuWl4Q%2F6ytkSkN2c2%2B4b4pPRF5eWOEOL1InRxlB5pEBedPFZPpgDrRvR9tFybtH%2BkesKLhIZ3WjJ0utzAwhl%2BgAlQY6ulvO0Djib20zcG5fkHOigpRf1xBUk%3D
Run Code Online (Sandbox Code Playgroud)
原来我的问题与 CORS 有关。为了让它发挥作用Django 1.6,我必须执行以下操作:
django-cors-headers并遵循配置说明https://github.com/ottoyiu/django-cors-headersGCS并接受来自我的域的请求https://developers.google.com/storage/docs/cross-originjquery将Django 文档中提供的代码添加到我的模板https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works 这样PUT,DELETE请求就开始起作用了。我遇到的唯一另一个问题是内容标题不兼容。因此,您需要在发送请求之前在签名网址中设置内容类型。
gsutil 命令看起来像
gsutil signurl -p notasecret -m PUT -d 10m -c 'multipart/formdata; charset=UTF-8' /path/to/.p12 gs://bucket_name/map.html
Run Code Online (Sandbox Code Playgroud)
添加 beforeSend 到 jquery 请求
beforeSend: function (request){
request.setRequestHeader("Content-Type", 'multipart/formdata; charset=UTF-8')
;},
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
788 次 |
| 最近记录: |