Проверьте, существует ли URL-адрес и связан ли он с аудиофайлом

#javascript

#javascript

Вопрос:

Я написал тест, чтобы проверить, что аудио (MP3, WAV) находится в правильном формате URL.

Теперь я хочу проверить две вещи:

  1. что URL-адрес существует
  2. сделайте запрос head, чтобы убедиться, что URL-адрес ссылается на аудиофайл

Как мне это сделать? Мне еще предстоит найти какие-либо хорошие примеры JavaScript для создания запросов head.

 // The test being performed    

if (result.onClose === true) {
  if(UtilService.isValidUrl(result.url) amp;amp; UtilService.isValidAudioUrl(result.url)) {
    console.log('url is valid')
  }
}

// In UtilService

static isValidUrl(urlToCheck: string) {
  let url;
  try {
    url = new URL(urlToCheck);
  } catch (_) {
    return false;
  }
  return url.protocol === 'http:' || url.protocol === 'https:';
}

// Unsure how to perform the check here

static isValidAudioUrl(urlToCheck: string) {
  const xhr = new XMLHttpRequest();
  xhr.open("HEAD", urlToCheck);
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
      console.log(xhr.status);
      console.log(xhr.responseText);
    }};
  xhr.send();

  // I'd like it to return a boolean value of true or false in isValidAudioUrl if the response header indicates the media type of the URL is audio and exists

  return false;
} 

Комментарии:

1. Как это происходит? Можете ли вы указать точный блокировщик?

2. Я бы хотел, чтобы он возвращал логическое значение true или false, isValidAudioUrl если заголовок ответа указывает, что тип носителя URL-адреса является аудио и существует.

3. Я понимаю вашу задачу. Мне интересно, какой именно блокировщик у вас есть, что побудило вас задать этот вопрос. Ваш фрагмент не запускается, поэтому, прежде чем я начну изучать вашу проблему, мне нужно понять, в чем проблема.

4. О, извините, что не объяснил. Мой текущий блокировщик не может понять, как выполнить эту проверку, учитывая действительный и недопустимый URL-адрес аудио. Извиняюсь за то, что фрагмент не работает.

5. Не беспокойтесь, я также пользователь с высоким рейтингом, который иногда задает вопрос, и некоторые люди отвергают его. Я думаю, что ваш вопрос верен, у меня просто есть некоторые пояснения. Итак, является ли недопустимый URL-адрес аудио допустимым URL-адресом, не указывающим на аудио, или полностью недопустимым URL-адресом? Кстати, я знаю об этой проблеме не больше, чем вы, но давайте попробуем разобраться.

Ответ №1:

Я думаю, что ваша функция проверки URL-адреса аудио может выглядеть следующим образом. Идея состоит в том, чтобы проверить заголовок Content-type ответа. Для аудиофайлов он обычно начинается с audio (например, audio / mpeg)

 function isValidAudioUrl(urlToCheck) {
  return fetch(urlToCheck, { method: 'HEAD', mode: 'no-cors' })
    .then(res => res.ok amp;amp; res.headers.get('content-type').startsWith('audio'))
    .catch(err => console.log(err.message));
}

// In your code
console.log('validating');

isValidAudioUrl('https://<YOUR_URL>.mp3')
.then(result => console.log(result));
 

Комментарии:

1. Спасибо, я попробовал это, но я получаю следующее сообщение об ошибке Access to fetch at 'https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.

2. Вы можете попробовать режим no-cors (обновил ответ)