Есть ли способ (предпочтительно с использованием JavaScript) определить, относится ли URL к SWF или JPG?
Очевидный ответ - обнюхать имя файла для ".jpg" или ".swf", но я имею дело с баннерами, которые динамически определяются сервером и обычно имеют много параметров и обычно не включают расширение.
поэтому мне интересно, могу ли я сначала загрузить файл, а затем как-нибудь прочитать его, чтобы определить, SWF это или JPG, а затем разместить его, потому что код JavaScript, который мне нужен для отображения JPG и SWF, очень отличается.
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен в точной настройке, которая у вас есть, но можете ли вы использовать ответ HTTP и проверить тип mime, чтобы определить изображение по сравнению с флэш-памятью?
Если URL-адрес не имеет расширения, это невозможно определить, не запрашивая файл с сервера.
Я бы расширил ответ Сиджина, сказав:
HTTP-запрос HEAD к URL-адресу может использоваться для проверки mime-типа ресурса. Ты Таким образом не потребуется загружать остальную часть файла.
Вы можете использовать javascript, чтобы определить, является ли это изображением, создав динамический тег img.
function isImage(url, callback) {
var img = document.createElement('img');
img.onload = function() {
callback(url);
}
img.src = url;
}
А затем вызовите его с помощью:
isImage('http://animals.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/animals/images/primary/bald-eagle-head.jpg', function(url) { alert(url + ' is a image'); });
Обновлять Эта версия всегда будет выполнять обратный вызов с логическим значением.
function isImage(url) {
var img = document.createElement('img');
img.onload = function() {
isImageCallback(url, true);
}
img.onerror = function() {
isImageCallback(url, false);
}
img.src = url;
}
function isImageCallback(url, result) {
if (result)
alert(url + ' is an image');
else
alert(url + ' is not an image');
}
Поместите свою логику в функцию isImageCallback.
если я сделаю это, думаю, он тоже попытается загрузить SWF. SWF-файлы можно загружать с помощью тега IMG, но при этом они никогда не отображаются правильно.
Я тестировал его в IE7, FF3 и Chrome. Обратный вызов не вызывается для swf.
Ок, отлично! Я пробовал это, и мне это нравится. только еще один вопрос: если я попытаюсь загрузить SWF, поскольку обратный вызов никогда не срабатывает, мне нужно разместить WSF по-другому. приведет ли это к 2 загрузкам SWF? или как мне обрабатывать SWF, если isImage не является изображением?
Да, было бы. Однако файл swf, вероятно, кэшируется браузером после первой попытки его загрузки. Я обновил ответ другой версией.
Полностью непроверенный, в основном просто идея:
function isImage(url)
{
var http = getHTTPObject();
http.onreadystatechange = function ()
{
if (http.readyState == 4)
{
var contentType = http.getResponseHeader("Content Type");
if (contentType == "image/gif" || contentType == "image/jpeg")
return true;
else
return false;
}
}
http.open("HEAD",url,true);
http.send(null);
}
function getHTTPObject()
{
if (window.XMLHttpRequest)
{
return new XMLHttpRequest();
}
else
{
if (window.ActiveXObject)
{
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
return false;
}
Мне это нравится, я думал о том, чтобы сделать что-то подобное. Один вопрос: если я сделаю запрос на определение типа изображения, а затем определю, что это изображение, так что загрузите его, приведет ли это к загрузке одного и того же изображения дважды?
Нет, при запросе с использованием «HEAD» извлекаются только заголовки HTTP.
возможно. Это чисто настройка JavaScript / flash, поэтому у меня не будет доступа ни к каким серверным скриптам для выполнения HTTP-запроса. Если это возможно через JS, хотя это может быть ответом.