Почему Google Cloud Storage всегда отвечает с ошибкой cors: на запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь загрузить файлы в Google Cloud Storage (GCS) из клиентского браузера. Для этого у меня есть серверная часть в node.js, запрашивающая подписанный URL-адрес из GCS, который затем передается клиентскому интерфейсу для загрузки файла. Код запроса подписанного URL-адреса следующий:

const options = {
    version: "v4",
    action: "write",
    expires: Date.now() + 15 * 60 * 1000, // 15 minutes
    contentType: content_type,
  };

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

Это работает. Проблема возникает, когда я пытаюсь использовать подписанный URL-адрес на клиенте. Каждый запрос заканчивается следующей ошибкой:

Доступ к XMLHttpRequest по адресу 'https://storage.googleapis.com/deploynets_models/keras_logo.png?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=urlsigner%40deploynets.iam.gserviceaccount.com%2F20200711%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20200711T192805Z&X-Goog-Expires=900&X-Goog-SignedHeaders=content-type%3Bhost&X-Goog-Signature=82b73435e4759e577e9d3b8056c7c69167fdaac5f0f450381ac616034b4830a7661bdb0951a82bf749a35dc1cf9a8493b761f8993127d53948551d7b33f552d118666dcf8f67f494cfaabf2268d7235e955e1243ce3cd453dcc32552677168ad94c6f1fca0032eb57941a806cc14139915e3cd3efc3585497715a8ad32a1ea0278f2e1165272951ae0733d5c6f77cc427fd7ff69431f74f1f3f0e7779c28c2437d323e13a2c6474283b264ab6dc6a94830b2b26fde8160684839a0c6ea551ca7eff8e2d348e09a8c213a93c0532f6fed1dd167cd9cf3480415c0c35987b27abd03684e088682eb5e89008d33dcbf630b58ea6b86e7d7f6574466aa2daa982566' из источника 'http://localhost: 3000' заблокирован политикой CORS: Нет 'Access-Control-Allow Заголовок -Origin 'присутствует в запрошенном ресурсе.

Я установил политику CORS для корзины GCS со следующим JSON:

[
  {
    "origin": ["*"],
    "method": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
    "responseHeader": ["*"],
    "maxAgeSeconds": 120
  }
]

(I' Мы также пробовали указать источник как http://localhost: 3000, например)

Следует упомянуть, что я заставил его работать в одном конкретном c случае: когда полезная нагрузка загрузки представляет собой простую строку . По какой-то причине это работает нормально.

Я просмотрел в Интернете все похожие ошибки, которые мог, но пока безрезультатно. Есть идеи?

1 Ответ

0 голосов
/ 12 июля 2020

Я понял, в чем дело. В коде загрузки (на стороне браузера) я передавал объект FormData в качестве данных для загрузки, что по какой-то причине вызывало указанную выше ошибку CORS. Я исправил это, когда я передал файл напрямую.

Поэтому вместо использования следующего:

var data = new FormData()
data.append('file', event.target.files[0])

я использую непосредственно файл в event.target.files[0].

...