如何在 Javascript 中检查资源的 MIME 类型?
How to check a resource's MIME type in Javascript?
我正在尝试创建一个函数来检查用户提供的资源,以查看它是否是有效的音频文件。
我在这里找到的所有内容都与上传文件后检查文件 MIME 类型有关。这不是我的目标。
//insert MIME type checking function here
const urlParams = new URLSearchParams(window.location.search);
const audioURL = urlParams('audiourl') // get audiourl from query (example.com/?audiourl=https://example.com/audio.wav)
if (mimetypecheck()) { // function to check mime type here
var audio = new Audio(audioURL);
audio.play();
} else {
//tell user invalid audio url, or unsupported audio type
}
正如评论中所说,检查资源是否指向某些 可播放 媒体的唯一方法是实际尝试播放它。
MIME 类型不会告诉你太多,而且 audio/video 媒体:
你不能 100% 确定容器(由 MIME 类型声明)真正包含什么,它很可能被编码在浏览器无法解码的编解码器中,即使它包装在浏览器的容器中应该知道。
这意味着即使一个简单的 HEAD 请求可以告诉您某些 URL 服务器将在 Content-Type headers 中发送什么能够播放它。鉴于大多数服务器无论如何都不会让您阅读这些 headers,因此不值得为此付出代价。
对于您的情况,最好尝试播放它。
因此您可以将代码重写为
const urlParams = new URLSearchParams(window.location.search);
const audioURL = urlParams('audiourl') // get audiourl from query (example.com/?audiourl=https://example.com/audio.wav)
const audio = new Audio(audioURL);
audio.onerror = (evt) => {
//tell user invalid audio url, or unsupported audio type
};
audio.play();
请注意,我们也可以绑定到由 HTMLMediaElement.play()
方法返回的 Promise 的 catch()
方法,但它实际上可能由于其他原因而触发(例如,如果用户从未进行过交互Chrome 之前的页面,或者如果此代码不是直接响应 Safari 中的 user-gesture)。如果您确定只有无效的 URL 可能是播放失败的原因,那么您可以这样做
const audio = new Audio(audioURL);
audio.play().catch( () => {
//tell user invalid audio url, or unsupported audio type
});
我正在尝试创建一个函数来检查用户提供的资源,以查看它是否是有效的音频文件。
我在这里找到的所有内容都与上传文件后检查文件 MIME 类型有关。这不是我的目标。
//insert MIME type checking function here
const urlParams = new URLSearchParams(window.location.search);
const audioURL = urlParams('audiourl') // get audiourl from query (example.com/?audiourl=https://example.com/audio.wav)
if (mimetypecheck()) { // function to check mime type here
var audio = new Audio(audioURL);
audio.play();
} else {
//tell user invalid audio url, or unsupported audio type
}
正如评论中所说,检查资源是否指向某些 可播放 媒体的唯一方法是实际尝试播放它。
MIME 类型不会告诉你太多,而且 audio/video 媒体:
你不能 100% 确定容器(由 MIME 类型声明)真正包含什么,它很可能被编码在浏览器无法解码的编解码器中,即使它包装在浏览器的容器中应该知道。
这意味着即使一个简单的 HEAD 请求可以告诉您某些 URL 服务器将在 Content-Type headers 中发送什么能够播放它。鉴于大多数服务器无论如何都不会让您阅读这些 headers,因此不值得为此付出代价。
对于您的情况,最好尝试播放它。
因此您可以将代码重写为
const urlParams = new URLSearchParams(window.location.search);
const audioURL = urlParams('audiourl') // get audiourl from query (example.com/?audiourl=https://example.com/audio.wav)
const audio = new Audio(audioURL);
audio.onerror = (evt) => {
//tell user invalid audio url, or unsupported audio type
};
audio.play();
请注意,我们也可以绑定到由 HTMLMediaElement.play()
方法返回的 Promise 的 catch()
方法,但它实际上可能由于其他原因而触发(例如,如果用户从未进行过交互Chrome 之前的页面,或者如果此代码不是直接响应 Safari 中的 user-gesture)。如果您确定只有无效的 URL 可能是播放失败的原因,那么您可以这样做
const audio = new Audio(audioURL);
audio.play().catch( () => {
//tell user invalid audio url, or unsupported audio type
});