Question

est-il un moyen de lire seulement quelques octets sur un champ de type BLOB dans une base de données (pour cette question, il n'a pas d'importance la marque DB) et déterminer si le contenu binaire est une image (en supposant qu'il est l'un des : JPG, GIF, PNG)? J'ai une webapp qui stocke les fichiers dans la base de données, et si elle est une image, je veux montrer une vignette, sinon je veux montrer une icône ... mais je n'ai pas d'info mimeType stocké nulle part ailleurs pour le blob (ce n'est pas ma conception) ... et parce qu'il est une webapp, le chargement de l'image doit se produire dans un appel séparé (getImage.ashx) d'écrire la balise .. et quand j'écris sur l'étiquette que je ne veux pas avoir à lire toute blob dans une bibliothèque, déterminer si elle est une image, la redimensionner, etc ... etc ... Je voudrais pouvoir regarder les premiers octets et savoir si je dois écrire l'étiquette ou non. Je ne comprends pas les structures de fichiers image / formats assez bien pour savoir s'il y a une sorte d'en-tête standard dans les premiers octets que je pouvais lire pour dire si elle est au format JPG, GIF ou PNG.

sens?

si vous voulez me aider spécifiquement (au lieu de répondre de manière générale si on peut le faire), alors je suis en utilisant .NET C # et SQL 2005

Merci!

Était-ce utile?

La solution

PNGs commencent par: 89 50 4E 47 0D 0A 1A 0A ; voir http://www.libpng.org/pub/png /spec/1.2/PNG-Structure.html

FPG commencent par 49 46 38 47 37 61 (GIF87a) ou 49 46 38 47 39 61 (GIF89a) ; voir http://www.fileformat.info/format/gif/egff.htm

JPEG commencent par FF FF D8 E0 xx xx 4A 46 49 46 00 (EDIT: ajouter la partie manquante de l'en-tête; xx xx est la longueur d'en-tête, en octets); voir http://www.obrador.com/essentialjpeg/headerinfo.htm

Référence: http://wangrui.wordpress.com/ 2007/06/19 / signatures de fichiers table /

Autres conseils

  • Les fichiers JPEG commencent par FF D8 FF
  • Les fichiers GIF commencent par GIF89a (47 49 46 38 39)

prend de nouveau à l'ancienne école (pour les tactiques d'accès aux données). Quoi qu'il en soit, vous pouvez utiliser un DataReader pour saisir le champ et les résultats cours d'eau, puis il suffit de regarder les sapins 8 octets pour voir quel genre d'image que vous avez affaire.

Voir cet article pour une intro sur comment attacher un StreamReader à votre datareader .

Cela dit, je ferais probablement juste tous les octets à moins que les images sont ginormous, principalement parce que toute vitesse à laquelle vous gagnez de l'examen l'en-tête pourrait être perdue lorsque plongeant dans le puits une deuxième fois.

Une autre tactique pourrait être de créer une vue qui inspecte le terrain et expose le type, sur la base des premiers octets d'en-tête, dans SQL. Genre un laid, mais fonctionne dans un pincement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top