2009-02-17 8 views
1

J'écris un programme qui télécharge des informations à partir du Web et une partie de ces images.Rechercher une image valide

En ce moment j'ai un problème car le code pour télécharger les images est une partie différente du code qui les affiche (sous mvc). Si un 404 est émis ou si le téléchargement de l'image échoue, le code d'affichage affiche un message que je souhaite éviter.

Existe-t-il un moyen facile de vérifier si une image est valide? Je suis seulement préoccupé par jpg, gif et png.

Remarque: Je ne me soucie pas de lire les données d'image, juste pour vérifier si c'est un format d'image valide.

Répondre

5

Voulez-vous vérifier si le téléchargement aboutit? Ou voulez-vous vérifier que ce qui est téléchargé est, en fait, une image? Dans le premier cas, la seule façon de vérifier est d'essayer d'y accéder et de voir quel type de code de réponse HTTP vous obtenez. Vous pouvez envoyer une requête HTTP HEAD pour obtenir le code de réponse sans réellement télécharger l'image, mais si vous allez simplement télécharger l'image (si elle réussit), envoyer une demande distincte HEAD semble être une perte de temps (et bande passante). Alternativement, si vous voulez vraiment vérifier que ce que vous téléchargez est un fichier image valide, vous devez lire tout le fichier pour le vérifier pour la corruption. Mais si vous voulez juste vérifier que l'extension du fichier est exacte, il devrait suffire de vérifier les premiers octets du fichier. Toutes les images GIF commencent par le texte ASCII GIF87 ou GIF89 selon la spécification GIF utilisée. Les images PNG commencent par le texte ASCII PNG, et les images JPEG ont un certain nombre magique, qui semble être 0xd8ffe0ff basé sur les JPEGs que j'ai regardés. (Vous devriez faire quelques recherches et vérifier cela, essayez Wikipedia pour les liens) Gardez à l'esprit, cependant, que pour obtenir même les premiers octets de l'image, vous devrez envoyer une requête HTTP qui pourrait renvoyer un 404 (et dans ce cas où vous n'avez aucune image à vérifier).

+0

Je pense que c'est une bonne réponse. C'est juste dommage que l'utilisation des méthodes Web attendues puisse être gâchée par un mauvais fonctionnement des scripts côté serveur. Pourtant, le conseil dans le deuxième paragraphe est solide. :) – jheriko

1

Si vous voulez vraiment savoir si un fichier image est valide, vous devez le décoder (bien que vous n'ayez pas besoin de stocker les bits). Cela est dû au fait que le fichier peut être de taille incorrecte ou peut être corrompu.

Si vous utilisez une bibliothèque HTTP pour effectuer les téléchargements, vous devriez pouvoir examiner l'en-tête et savoir que vous obtenez une erreur 404 et non une charge utile réelle. Regardez la documentation de la bibliothèque que vous utilisez.

Si vous récupérez un fichier et que vous voulez voir s'il s'agit probablement d'une image sans décodage complet, vous devez vérifier la validité des en-têtes. libpng et libjpeg offrent un accès assez bas niveau aux fichiers png et jpeg, respectivement. Vous pouvez également consulter des bibliothèques de niveau supérieur telles que ImageMagick, le MFC de Microsoft ou toute autre bibliothèque adaptée à votre plate-forme.

3

Merci pour les réponses les gars. J'ai tout déjà téléchargé le fichier, donc je suis allé avec juste vérifier le nombre magique comme l'extrémité avant que j'utilise (wxWidgets) tout prêt a une bibliothèque d'images et je voulais quelque chose de très léger.

uint8 UTIL_isValidImage(const unsigned char h[5]) 
{ 

    //GIF8 
    if (h[0] == 71 && h[1] == 73 && h[2] == 70 && h[3] == 56) 
     return IMAGE_GIF; 

    //89 PNG 
    if (h[0] == 137 && h[1] == 80 && h[2] == 78 && h[3] == 71) 
     return IMAGE_PNG; 

    //FFD8 
    if (h[0] == 255 && h[1] == 216) 
     return IMAGE_JPG; 

    return IMAGE_VOID; 
} 
0

Lorsque vous GET une ressource via HTTP, vous devez utiliser l'en-tête Content-Type pour déterminer comment traiter le contenu. Si vous l'avez déjà téléchargé dans un fichier local, les informations qu'un véritable navigateur Web utilise sont déjà perdues. Dans de nombreux cas, l'URL correspond au type de contenu (par ex.http://example.com/image.png est servi comme Content-Type: image/png). Cependant, vous ne pouvez pas compter sur cela.

+0

Le problème est lorsque le web vous donne une page d'erreur 404 au lieu de l'iamge – Lodle

+0

Une réponse 404 qui contient du contenu devrait toujours spécifier un type de contenu s'il s'attend à être rendu. – Tom

Questions connexes