2009-09-20 11 views
2

J'ai l'obligation de vérifier qu'une URL spécifiée par l'utilisateur correspond à une image. Donc vraiment j'ai besoin d'un moyen de déterminer qu'une chaîne URL pointe vers une image valide. Comment puis-je faire cela dans .NET?.NET: Vérifier que l'URL est l'image

Répondre

0

Voici ce que j'utilise maintenant. Des critiques?

public class Image 
{ 
    public static bool Verifies(string url) 
    { 
     if (url == null) 
     { 
      throw new ArgumentNullException("url"); 
     } 

     Uri address; 

     if (!Uri.TryCreate(url, UriKind.Absolute, out address)) 
     { 
      return false; 
     } 

     using (var downloader = new WebClient()) 
     { 
      try 
      { 
       var image = new Bitmap(downloader.OpenRead(address)); 
      } 
      catch (Exception ex) 
      { 
       if (// Couldn't download data 
        ex is WebException || 
        // Data is not an image 
        ex is ArgumentException) 
       { 
        return false; 
       } 
       else 
       { 
        throw; 
       } 
      } 
     } 

     return true; 
    } 
} 
+0

Que faire si le lien est réellement à un ISO de 4,7 Go. Voulez-vous vraiment télécharger l'ensemble et essayer de convertir en bitmap pour déterminer s'il s'agit d'une image? Si cela faisait partie d'une webapp, cela pourrait utiliser toute votre bande passante dans un DoS assez rapidement. Je pense que vous devriez vérifier le type de contenu envoyé dans les en-têtes de réponse comme suggéré par Mike K, ou vérifier l'extension du fichier. Si vous devez vraiment télécharger, vérifiez la longueur du contenu et assurez-vous de ne rien télécharger de manière ridiculement grande. –

3

Vous ne pouvez pas faire cela sans télécharger le fichier (au moins une partie). Utilisez un WebClient pour récupérer l'URL et essayez de créer un nouveau Bitmap à partir du byte[]. Si c'était réussi, c'est vraiment une image. Sinon, il va lancer une exception quelque part dans le processus.

Par ailleurs, vous pouvez émettre une demande HEAD et vérifiez l'en-tête Content-Type dans la réponse (si elle est là). Cependant, cette méthode n'est pas infaillible. Le serveur peut répondre avec un en-tête Content-Type non valide.

+0

Cela dépend de la gravité de la validité de l'image. Le type de contenu fonctionne généralement, mais certains serveurs ne fonctionnent pas bien, et vous pourriez obtenir une exception ennuyante plus tard. Le téléchargement est en effet le seul moyen d'être certain. –

2

Je voudrais utiliser HttpWebRequest pour obtenir les en-têtes, puis vérifier le type de contenu, et que la longueur du contenu est différente de zéro.