我希望站点的用户能够在google cloud storage
不使用Web应用程序服务器资源的情况下将文件上传到其中,因此签名的URL似乎是一种解决方法。
当用户选择要上传的文件时,jquery
会将GET
请求发送到django
签名的URL。网址是使用gsutil signurl
命令生成的。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
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
原来我的问题与CORS有关。为了使它继续工作Django 1.6
,我必须执行以下操作:
django-cors-headers
并遵循配置说明https://github.com/ottoyiu/django-cors-headersGCS
使用适当的动词在存储桶中配置CORS,并接受来自我的域的请求https://developers.google.com/storage/docs/cross-originjquery
将Django文档中提供的代码添加到我的模板https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works这样PUT
,DELETE
请求开始工作。我遇到的唯一其他问题是不兼容的内容标题。因此,在发送请求之前,您需要在签名的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')
;},
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句