Gsutil подписанный Url помещенный в Google Cloud Storage терпит неудачу
Я бы хотел, чтобы пользователи сайта могли загружать файлы в google cloud storage
без использования ресурсов серверов веб-приложений, поэтому подписанные URL-адреса кажутся подходящим способом.
Когда пользователь выбирает файл для загрузки, jquery
отправляет запрос GET
на django
для подписанного url. 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 ввел код...
$.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 ответ:
Оказывается, моя проблема была связана с Корсом. Чтобы заставить это работать на
Django 1.6
, я должен был сделать следующее:
- установите
django-cors-headers
и следуйте инструкциям по настройке https://github.com/ottoyiu/django-cors-headers- настроить CORS на ведре
GCS
с соответствующими глаголами и принимать запросы от моего домена https://developers.google.com/storage/docs/cross-origin- добавьте код
jquery
, указанный в документах 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') ;},