2008-11-05 12 views
2

Existe-t-il un moyen (de préférence avec JavaScript) de déterminer si une URL correspond à un fichier SWF ou à un fichier JPG? La réponse évidente est de renifler le nom de fichier pour ".jpg" ou ".swf" mais j'ai affaire à des bannières qui sont décidées dynamiquement par le serveur et ont généralement beaucoup de paramètres et n'incluent généralement pas de extension. Donc je me demande si je pourrais d'abord charger le fichier puis le lire pour déterminer s'il s'agit d'un fichier SWF ou JPG, puis le placer, car le code JavaScript dont j'ai besoin pour afficher un fichier JPG par rapport à un fichier SWF est très différent.comment détecter si une URL pointe vers un fichier SWF

Merci!

Répondre

3

Vous pouvez utiliser javascript pour détecter s'il s'agit d'une image en créant une img-tag dynamique.

function isImage(url, callback) { 
    var img = document.createElement('img'); 
    img.onload = function() { 
     callback(url); 
    } 
    img.src = url; 
} 

Et puis appeler avec:

isImage('http://animals.nationalgeographic.com/staticfiles/NGS/Shared/StaticFiles/animals/images/primary/bald-eagle-head.jpg', function(url) { alert(url + ' is a image'); }); 

Mise à jour Cette version exécutera toujours le rappel avec une valeur booléenne.

 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'); 
    } 

Mettez votre logique dans la fonction isImageCallback.

+0

si je fais cela, je pense qu'il va essayer de charger le fichier SWF aussi. Les fichiers SWF peuvent être chargés avec l'étiquette IMG, ils ne s'affichent jamais correctement lorsque vous le faites. – nerdabilly

+0

Je l'ai testé dans IE7, FF3 et Chrome. Le rappel n'est pas appelé pour swf. – loraderon

+0

ok super! J'ai essayé cela et j'aime ça. une seule autre question: si je tente de charger un fichier SWF, puisque le rappel ne se déclenche jamais, je dois placer le fichier WSF différemment. cela entraînerait-il deux charges du fichier SWF? ou comment est-ce que je manipulerais un SWF quand isImage résulte en n'étant pas une image? – nerdabilly

2

Je ne suis pas sûr de la configuration exacte que vous avez, mais pouvez-vous utiliser la réponse HTTP et vérifier le type mime pour déterminer l'image vs flash?

+0

peut-être. C'est une installation purement JavaScript/Flash si bien que je n'aurai aucun accès à des scripts côté serveur pour faire une requête HTTP. Si cela est possible grâce à JS, cela pourrait être la réponse. – nerdabilly

0

Si l'URL n'a pas d'extension, il n'y a aucun moyen de le savoir sans demander le fichier au serveur.

3

J'étendrait la réponse de Sijin en disant:

Une requête HTTP HEAD à l'URL peut être utilisé pour examiner mime-type de la ressource. Vous n'aura pas besoin de télécharger le reste du fichier de cette façon.

3

complètement non testé, basiquement juste une idée:

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; 
} 
+0

J'aime ça, je pensais à faire quelque chose comme ça. Une question, si je fais la demande pour déterminer le type de l'image, puis déterminer si c'est une image pour la charger, est-ce que cela entraîne le chargement de la même image deux fois? – nerdabilly

+0

Non, la demande d'utilisation de "HEAD" récupère uniquement les en-têtes HTTP. – FlySwat

Questions connexes