Чтение аудио/mp3-файла из корзины GCP заблокировано политикой CORS: отсутствует заголовок «Access-Control-Allow-Origin»

Я пытаюсь создать аудиоплеер с помощью js и flask. Аудиофайлы извлекаются из корзины GCP, а аудиофайлы имеют общий доступ. Но когда я пытаюсь воспроизвести звук, он выдает

Access to audio at 'https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3' from origin 'http://localhost' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
GET https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3 net::ERR_FAILED 206

Мой HTML-код выглядит так:

<audio class = "js-audio-source" src = "https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3" crossorigin = "anonymous">
  <source src = "https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3" type = "audio/mp3">
</audio>
<ul id = "audio-playlist" class = "text-start ml-4">
  <li style = "cursor:pointer;" title = "Chapter 01" data-chapter-id = "1" index = "1" path = "https://storage.googleapis.com/blah-bucket-1/audio-files/13_chapter_.mp3">
    ▶ Chapter 01
  </li>
</ul>
<input type = "range" id = "seek-bar" value = "0" style = "display: block;width: 500px;">


<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.1/jquery.min.js" integrity = "sha512-aVKKRRi/Q/YV+4mjoKBsE4x3H+BkegoM/em46NNlCqNTmUYADjBbeNefNxYV7giUp0VxICtqdrbqU7iVaeZNXA= = " crossorigin = "anonymous" referrerpolicy = "no-referrer"></script>
<script>
  var playlist = document.querySelector("#audio-playlist");
  var total_songs = playlist.children.length;
  
  var default_volume = 0.05;
  $(".volume-count").html((default_volume*300)/3);
  
  var seek_bar = document.querySelector("#seek-bar");
  seek_bar.value = 0;
  
  var audio_source = document.querySelector(".js-audio-source");
  var current_song = 0;


  var audio_api;
  var gain_node;
  var analyser_node;
  var track;
  var interval;

  function init(){
    audio_source.src = playlist.children[current_song].getAttribute("path");
    var playingChapterID = playlist.children[current_song].getAttribute("data-chapter-id");
    audio_source.volume = default_volume;
    audio_source.crossOrigin = "anonymous";
  }
  init()
  
  playlist.addEventListener('click', function(e){
    current_song = parseInt(e.target.getAttribute("index"))-1 ;
    init();
    play();
  });
  
  function song(path){
    audio_source.src = path;
  }
  
  function play(){
    audio_source.play();
    interval = setInterval(update_seek, 60);
    if (audio_api === undefined){
      audio_api = new window.AudioContext() || new window.WebkitAudioContext();
      gain_node = audio_api.createGain();
      analyser_node = audio_api.createAnalyser();
      track = audio_api.createMediaElementSource(audio_source);
    }
    track.connect(analyser_node).connect(gain_node).connect(audio_api.destination);
  }
  function pause(){
    audio_source.pause();
    clearInterval(interval);
  }
  function update_seek(){
    seek_bar.value = (audio_source.currentTime/audio_source.duration)*100;
  }
  $(document).keydown(function(e) {
    if (e.keyCode == 32) {  // Space key
      e.preventDefault();
      play()
    }
    if (e.keyCode == 27) {  // Space key
      e.preventDefault();
      pause()
    }
  });
</script>

Я попытался добавить audio_source.crossOrigin = "anonymous"; в функцию init(), а также попытался добавить crossorigin = "anonymous" prop в тег audio. Но, похоже, это не работает.

Плеер отлично работает (по крайней мере, воспроизводит, приостанавливает и ищет обновления) с локальными аудиофайлами. И когда я напрямую открываю URL-адрес аудио корзины GCP в браузере, он воспроизводится без проблем.

Как я могу это исправить? Пожалуйста, помогите.

Короче говоря, CORS — это механизм, с помощью которого сервер контролирует доступ к своим ресурсам — сервер, с которого вы получаете звук, не разрешает доступ к этому ресурсу из сценария браузера с перекрестным происхождением ... TL; DR, вы не можете это исправить в коде браузера

Jaromanda X 25.01.2023 11:24

@JaromandaX спасибо за ответ. Есть ли у вас какие-либо предложения по решению этой проблемы?

Dulan Pabasara 25.01.2023 12:17
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте настроить CORS в корзине GCP, содержащей аудиофайлы. Вы можете проверить этот document1 и document2, чтобы узнать, как настроить CORS для корзины GCP.

gsutil cors set cors-json-file gs://<bucket_name>

Это загрузит эти настройки конфигурации CORS в вашу корзину. И после этого вы можете получить текущие настройки в любое время, используя gsutil cors get gs://<bucket_name>.

gsutil cors позволяет получить или установить конфигурацию CORS для одного или нескольких сегментов. Это поддерживается только для сегментов, а не для объектов. Пример документа CORS JSON выглядит следующим образом:

[
    {
      "origin": ["http://localhost”],
      "method": ["GET"],
      "responseHeader": ["Content-Type"],
      "maxAgeSeconds": 3600
    }
]

Также проверьте приведенные ниже аналогичные примеры

CORS установлен, но не влияет на запрос

gs:// не имеет конфигурации CORS

Почему Google Cloud Storage всегда отвечает ошибкой cors: на запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin»

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