Ошибка CORS корзины Google Cloud Storage, хотя политика CORS установлена

У меня есть подписанный URL-адрес для ведра облачного хранилища Google, и я хочу использовать его с axios, чтобы сделать запрос PUT.

Моя функция putFileData вызывается, когда переменная signedURL не пуста, через useEffect.

  const putFileData = async () => {
    await axios
    .put(signedURL, "HELLO TXT!!!!")
    .then((response) => console.log(response))
    .catch(err => {console.log("AXIOS ERROR: ", err)})  
}

Я устанавливаю политику CORS для корзины с помощью файла json, и когда я запрашиваю политику cors корзины, я получаю:

[{"maxAgeSeconds": 360, "method": ["PUT"], "origin": ["http://localhost:3000"], "responseHeader": ["Content-Type"]}]

Параметры моего подписанного URL-адреса:

const options = {
  version: 'v4',
  action: 'write',
  expires: Date.now() + 15 * 60 * 1000, // 15 minutes
  contentType: 'application/octet-stream',
};

Тем не менее, я все еще не могу выполнить запрос PUT с http://localhost:3000.

Я получил:

Access to XMLHttpRequest at 'mysignedurl' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

а также:

PUT mysignedurl::ERR_FAILED

На моей вкладке "Сеть" инструментов разработчика Chrome он показывает, что запрос был сделан дважды - сначала безуспешно со статусом 403, затем успешно со статусом 200 - но в корзину ничего не загружено.

Мой подписанный URL-адрес создается с помощью этой функции в моих облачных функциях:

async function generateV4UploadSignedUrl(bucketName, fileName) {
// These options will allow temporary uploading of the file with outgoing
// Content-Type: application/octet-stream header.
const options = {
  version: 'v4',
  action: 'write',
  expires: Date.now() + 15 * 60 * 1000, // 15 minutes
  contentType: 'application/octet-stream',
};

// Get a v4 signed URL for uploading file
const [url] = await storage
  .bucket(bucketName)
  .file(fileName)
  .getSignedUrl(options)
  
return url;

};

1 ответ

С помощью команды поддержки Google Cloud я выяснил, что ContentType неверен. Я изменил параметры на:

contentType: 'application/x-www-form-urlencoded',

и это сработало!

Другие вопросы по тегам