Comment détecter si un fichier est un fichier PDF ou TIFF?
S'il vous plaît garder avec moi comme je l'ai été jeté dans le milieu de ce projet sans connaître tous les antécédents. Si vous avez WTF questions, faites-moi confiance, je les ai aussi.
Voici le scénario: j'ai un tas de fichiers résidant sur un serveur IIS. Ils n'ont pas d'extension de fichier. Juste à nu des fichiers avec des noms comme "asda-2342-sd3rs-asd24-ut57" et ainsi de suite. Rien d'intuitif.
Le problème est que j'ai besoin de servir des fichiers sur un ASP.NET (2.0) page et afficher les fichiers tiff tiff et PDF fichiers PDF. Malheureusement, je ne sais pas qui est qui et j'ai besoin d'être en mesure de les afficher de manière appropriée dans leurs formats respectifs.
Par exemple, permet de dire qu'il y a 2 fichiers dont j'ai besoin pour afficher, on est tiff et un est PDF. La page devrait s'afficher avec une image tiff, et peut-être un lien qui permettrait d'ouvrir le fichier PDF dans un nouvel onglet/fenêtre.
Le problème:
Que ces fichiers sont tous à l'extension de moins j'ai eu la force IIS juste servir de tout ce que TIFF. Mais si je fais cela, les fichiers PDF ne s'affiche pas. Je pourrais changer de IIS pour forcer le type MIME à PDF pour fichier inconnu extensions, mais je préfère avoir le problème inverse.
http://support.microsoft.com/kb/326965
Ce problème est-il plus facile que je pense ou est-il aussi méchant que je suis dans l'attente d'?
OriginalL'auteur eviljack | 2010-04-28
Vous devez vous connecter pour publier un commentaire.
OK, assez de gens sont obtenir cette erreur, que je vais poster le code que j'ai pour identifier les fichiers Tiff:
J'ai piraté à part certains beaucoup plus générale de code pour obtenir ce.
Pour le PDF, j'ai un code qui ressemble à ceci:
Maintenant, GetToken() est un appel à un scanner qui tokenizes un Flux de données en PDF jetons. C'est non trivial, donc je ne vais pas à la coller ici. Je suis en utilisant le générateur de jetons au lieu de regarder sous-chaîne pour éviter un problème comme ceci:
ce code est marqué comme PAS un PDF par l'extrait de code ci-dessus, tandis que d'un simple bout de code, à tort, de le marquer comme un PDF.
Je dois également souligner que la norme ISO spec est dépourvue de la mise en œuvre des notes qui ont été dans le précédent Adobe appartenant à la spécification. Le plus important de la Référence PDF, version 1.6:
génial, ça marche!!!!
la stm.Seek(0); n'est pas pour moi, pas de compile. Je suis avec vs 2008, .net 3.5.
Désolé, je déteste avoir à mettre SeekOrigin.Se lancer dans la majorité des cas - c'est une méthode d'extension.
Qu'est-ce que GetToken() et le jeton.TokenType == MLPdfTokenType.Commentaire ? tout le code ? la bibliothèque fait partie de ce code ?
OriginalL'auteur plinth
TIFF peuvent être détectées en jetant un coup d'œil premiers octets http://local.wasp.uwa.edu.au/~pbourke/formats/tiff/
Sur le PDF: http://www.adobe.com/devnet/livecycle/articles/lc_pdf_overview_format.pdf
ok, ici, est la plus complète spec adobe.com/devnet/acrobat/pdfs/pdf_reference_1-7.pdf il est >30 Mo
OriginalL'auteur Andrey
La lecture de la spécification pour chaque format de fichier va vous dire comment faire pour identifier les fichiers de ce format.
TIFF fichiers - Vérifier les octets 1 et 2 pour 0x4D4D ou 0x4949 et octets 2 et 3 pour la valeur '42'.
La Page 13 de la spec lit:
PDF fichiers de commencer avec la version PDF suivie par plusieurs octets binaires. (Je pense que vous avez maintenant à l'achat de l'ISO spec pour la version actuelle.)
La Section 7.5.2
Bien sûr, vous pourriez faire un "plus" vérifier chaque fichier en vérifiant plus de fichier des éléments spécifiques.
OriginalL'auteur
Une liste très utile des Signatures de Fichiers aka "nombres magiques" par Gary Kessler est disponible http://www.garykessler.net/library/file_sigs.html
OriginalL'auteur Shaji
En interne, le fichier d'informations d'en-tête devrait aider. si vous faites un faible niveau d'ouverture de fichier, de telle que StreamReader() ou FOPEN(), regarde les deux premiers caractères dans le fichier... Presque tous les fichiers de type a sa propre signature.
J'ai eu à traiter avec le présent dans le passé aussi... aussi pour aider à prévenir les fichiers indésirables soient envoyés à un site donné et immédiatement l'abandonner une fois la case cochée.
EDIT -- Posté exemple de code permettant de lire et de test en-tête de fichier types
J'ai posté le code à jour par exemple C#
Ne doit pas être écrit "semble commencer avec" dans la partie critique de réponse! Par spec, les fichiers TIFF de commencer avec 2 octets ASCII "II" ou "MM", suivi de 2 octets (II) Intel little-endian, ou (MM) Motorola big-endian d'ordre des octets, formant l'entier 42.
OriginalL'auteur DRapp
Si vous allez ici, vous verrez que le TIFF commence généralement avec des "nombres magiques" 0x49 0x49 0x2A 0x00 (certains autres définitions sont également donnés), qui est les 4 premiers octets du fichier.
Alors il suffit d'utiliser ces 4 premiers octets pour déterminer si le fichier est au format TIFF ou pas.
MODIFIER, il est probablement mieux de le faire dans l'autre sens, et de détecter les PDF en premier. Les numéros de magie pour les fichiers PDF ne sont plus normalisés: Comme Socle gentiment fait remarquer qu'ils commencent par "%PDF" quelque part dans les 1024 premiers octets (0x25 0x50 0x44 0x46). source
C'est proche, mais mal. Un TIFF commence avec l'une des deux signatures, 0x49 0x49 0x2a 0x00 OU 0x4d 0x4d 0x00 0x2a.
Votre de contrôle de PDF est également faux. L' %PDF besoin n'apparaissent que dans les 1024 premiers octets.
OriginalL'auteur Martin Konecny
Vous allez avoir à écrire une ashx pour obtenir le fichier demandé.
ensuite, votre gestionnaire doit lire les premiers octets (ou plus) pour déterminer quel est le type de fichier est vraiment-- PDF et TIFF ont "magie chiffres" en début de fichier que vous pouvez utiliser pour déterminer cela, puis définissez vos en-Têtes de Réponse en conséquence.
OriginalL'auteur Muad'Dib
vous pouvez utiliser Myrmec à identifier le type de fichier, cette bibliothèque utiliser le fichier octet de tête. cette bibliothèque est disponible sur nuget "Myrmec",et c'est le repo, myrmec également en charge les types mime,vous pouvez l'essayer. le code sera comme ceci :
et obtenir type mime :
chaîne mimeType = MimeTypes.GetMimeType(le résultat.First());
mais qui prennent en charge tiff seulement "49 49 2A 00" et "4D 4D 00 2A" deux signature, si vous avez plus, vous pouvez ajouter votre auto, peut-être vous pouvez voir le fichier lisezmoi de myrmec pour obtenir de l'aide. myrmec dépôt github
OriginalL'auteur RocketRobin