2

Я пытаюсь получить доступ к памяти ведро Google облако с Аксиос, чтобы загрузить файл:InvalidPolicyDocument, недостающее ошибка политики хранения Google облако

я установить политику CORS в ведре:

[ 
    { 
     "origin": ["http://localhost:8000", "localhost"], 
     "responseHeader": ["Access-Control-Allow-Origin", "Content-Type"], 
     "method": ["GET", "HEAD", "DELETE", "PUT", "POST"], 
     "maxAgeSeconds": 3600 
    } 
] 

Тогда Я генерировать подписанный URL, используя эту команду: GSUtil

gsutil signurl -m RESUMABLE -d 1h my-key.json gs://test-bucket/ 

Тогда я, наконец, отправить этот запрос Вардар POST:

var startLink = "signed url from gsutil" 
var data = { 
    'Content-Length': 0, 
    'Content-Type': 'text/plain', 
    'x-goog-resumable': 'start', 
    host: 'test-django-bucket.storage.googleapis.com', 
}; 

axios.post(startLink, data) 
    .then(function(response) { 
    console.log(respone); 
    }); 

Этот результат я получаю:

<?xml version='1.0' 
encoding='UTF-8'?><Error><Code>InvalidPolicyDocument</Code><Message>The content of the form does not meet the conditions specified in the 
policy document.</Message><Details>Missing policy</Details></Error> 

Что именно я сделал не так? Я следую инструкциям here.


Update: Пара заметок о том, что я должен был исправить, чтобы получить все работает после того, как несколько раз из @BrandonYarbrough ниже:

Первый запрос Вардар был неправ, он должен быть:

var data = { 
    headers: { 
    'content-type': 'text/plain', 
    'x-goog-resumable': 'start', 
    } 
}; 
axios.post(startLink, {}, data) 
    .then(function(response) { 
    console.log(response); 
    }); 

Далее я должен был обновить gstuil команду, как описано ниже:

gsutil signurl -m RESUMABLE -d 10h -c "text/plain" mykey.json gs://test-bucket 
+0

Дальнейшее уточнение, прочитав здесь документацию, кажется, что мне не нужен документ политики вообще, поскольку я использую подписанный URL, но ... https://cloud.google.com/storage/docs/access-control/ – Ian

ответ

2

Для добавления в подпись вам необходимо предоставить gsutil две другие части информации: Content-Type и имя создаваемого объекта. Попробуйте эту команду:

gsutil signurl -m RESUMABLE -d 1h -c "text/plain" my-key.json gs://test-bucket/object-name.txt 

Кроме того, GSUtil, вероятно, выводить URL, как "storage.googleapis.com/test-django-bucket/your_object?lotsOfUrlParameters". Если вы должны были перейти к этому URL-адресу, указав заголовок узла «test-django-bucket.storage.googleapis.com», оказалось, что вам действительно нужен объект с именем «test-django-bucket/your_object» внутри ковш под названием «test-django-bucket». Либо удалите заголовок хоста, либо сразу нажмите на файл storage.googleapis.com или отредактируйте URL-адрес, возвращенный gsutil, чтобы удалить бит «test-django-bucket».

Кроме того, вы отправляете заголовки как данные, я думаю. Я думаю, что заголовки axios заданы с помощью раздела конфигурации «заголовки».

+0

Эти изменения, вероятно, необходимы, но я все равно получаю тот же ответ «Отсутствующая политика» 400. Также получите этот код ошибки из gsutil: CommandException: Object gs: //test-django-bucket/test.txt не существует. Создайте/загрузите объект с этим именем перед созданием подписанного URL-адреса для доступа к нему. – Ian

+0

Я уверен, что проблема в том, что я не указал политику доступа для ведра, но я не совсем уверен, как указать политику. Я попытался подписать его с версией base64, как описано здесь, но такой удачи не было. https://cloud.google.com/storage/docs/xml-api/post-object#usage_and_examples – Ian

+1

Соблюдайте это сообщение об ошибке; это ожидаемо. test.txt не существует, потому что вы еще не загрузили его. –