2010-10-11 6 views
2

Cette URL vous amène à une image, mais n'a pas d'extension de fichier pour vérifier une expression régulière contre:Si une URL ne contient pas de nom de fichier, puis-je déterminer si elle mène à une image?

http://www.tonymooreillustration.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=393 

J'utilise Restclient (HTTP et client REST pour Ruby) dans mon application, j'ai essayé de le faire :

RestClient.get "http://www.tonymooreillustration.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=393" 

Je reviens beaucoup de texte qui commence comme ceci:

"\377???JFIF\000\001\002\001\000H\000H\000\000\377?cExif\000\000MM\000*\000\000\000\b\000\a\001\022\000\003\000\000\000\001\000\001\000\000\001\032\000\005\000\000\000\001\000\000\000b\001\e\000\005\000\000\000\001\000\000\000j\001(\000\003\000\000\000\001\000\002\000\000\0011\000\002\000\000\000\024\000\000\000r\0012\000\002\000\000\000\024\000\000\000\206\207i\000\004\000\000\000\001\000\000\000\234\000\000\000?\000\000H\000\000\000\001\000\000\000H\000\000\000\001Adobe Photoshop 7.0\0002005:07:12 02:58:19\000\000\000\000\003\240\001\000\003\000\000\000\001\377\377\000\000\240\002\000\004\000\000\000\001\000\000\001?\000\004\000\000\000\001\000\000\002?\000\000\000\000\000\006\001\003\000\003\000\000\000 

est-il possible que je peux utiliser pour déterminer si l'URL pointe à une image?

Répondre

2

Il semble que la réponse du client REST enveloppements Net::HTTPResponse Ruby donc si res est le résultat de RestClient.get vous devriez être en mesure de le faire:

res.net_http_res.header['content-type'] 

et voir si cela commence par image/image/jpeg pour une image JPEG.

Si vous n'avez pas réellement besoin d'une copie de l'image et juste besoin de vérifier à quoi pointe l'URL, alors vous feriez mieux de faire une demande HEAD comme le suggère reto. (cela évite de recevoir une copie inutile du contenu du corps.)

2

Vous pouvez faire une requête HEAD et vérifier l'en-tête pour les informations MIME.

Voir: http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html#M000682

La réponse que vous obtenez dans votre exemple est l'image elle-même. Vous essayez également de déterminer si c'est une image en utilisant un utilitaire comme le fichier [1] ou avec une bibliothèque d'images comme imagemagick [2].

[1] http://unixhelp.ed.ac.uk/CGI/man-cgi?file [2] http://rmagick.rubyforge.org/

+0

Le texte renvoyé est les données binaires de l'image à écrire dans le fichier/db. Vous devriez vérifier le type mime dans les informations d'en-tête comme suggéré ici. Si vous devez également dérouler le contenu du fichier, vous pouvez vérifier les en-têtes dans la même requête sans avoir besoin d'une requête HEAD séparée. – Jeremy

0

Je l'ai fait il y a environ 5 ans en php. Malheureusement, je n'ai plus le code. Fondamentalement, j'ai utilisé curl avec une option pour suivre toutes les redirections. De cette façon, les données qui étaient retournées au programme étaient presque toujours ce que je voulais réellement tester. À partir de là, je ne récupérerais que les premiers octets de données du contenu et vérifierais si les méta-données de l'image existaient et s'il s'agissait ou non de jpg, png ou gif. Avoir le code pour vous montrer aiderait probablement à expliquer cela beaucoup mieux, mais c'est parti. J'ai comparé cela à "goûter" un fichier avant de le manger. L'utilisation de ce type de technique présente l'avantage de vérifier le fichier au lieu de s'appuyer sur les informations d'en-tête, ce qui est généralement correct mais pas toujours.

1

Votre meilleur pari est l'en-tête Content-Type, mais si tout le reste échoue, vous pouvez obtenir le format d'image de l'ensemble initial d'octets:

  • JPG: 0xFF 0xD8
  • PNG: 0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
  • GIF: 'G' 'I' 'F'

Rechercher <format> file format, en remplacement <format> avec les autres formats de fichiers dont vous avez besoin pour identif y.

0

Utilisez FastImage - il faudra saisir le minimum de données de l'URL pour déterminer s'il s'agit d'une image, quel type d'image et la taille.

Questions connexes