web-dev-qa-db-fra.com

Comment extraire l'extension de fichier du tableau d'octets

J'ai un tableau d'octets dans la base de données.

Comment extraire l'extension de fichier (mime/type) du tableau d'octets en Java?

21
emilan

S'il s'agit de stocker un fichier qui est téléchargé:

  • créer une colonne pour l'extension du nom de fichier
  • créer une colonne pour le type mime envoyé par le navigateur

Si vous n'avez pas le fichier d'origine et que vous n'avez que des octets, vous avez quelques bonnes solutions.

Si vous pouvez utiliser une bibliothèque, regardez à l'aide de mime-util pour inspecter les octets:

http://technopaper.blogspot.com/2009/03/identifying-mime-using-mime-util.html

Si vous devez créer votre propre détecteur d'octets, voici plusieurs des octets de départ les plus populaires:

"BC" => bitcode,
"BM" => bitmap,
"BZ" => bzip,
"MZ" => exe,
"SIMPLE"=> fits,
"GIF8" => gif,
"GKSM" => gks,
[0x01,0xDA].pack('c*') => iris_rgb,
[0xF1,0x00,0x40,0xBB].pack('c*') => itc,
[0xFF,0xD8].pack('c*') => jpeg,
"IIN1" => niff,
"MThd" => midi,
"%PDF" => pdf,
"VIEW" => pm,
[0x89].pack('c*') + "PNG" => png,
"%!" => postscript,
"Y" + [0xA6].pack('c*') + "j" + [0x95].pack('c*') => Sun_rasterfile,
"MM*" + [0x00].pack('c*') => tiff,
"II*" + [0x00].pack('c*') => tiff,
"gimp xcf" => gimp_xcf,
"#FIG" => xfig,
"/* XPM */" => xpm,
[0x23,0x21].pack('c*') => Shebang,
[0x1F,0x9D].pack('c*') => compress,
[0x1F,0x8B].pack('c*') => gzip,
"PK" + [0x03,0x04].pack('c*') => pkzip,
"MZ" => dos_os2_windows_executable,
".ELF" => unix_elf,
[0x99,0x00].pack('c*') => pgp_public_ring,
[0x95,0x01].pack('c*') => pgp_security_ring,
[0x95,0x00].pack('c*') => pgp_security_ring,
[0xA6,0x00].pack('c*') => pgp_encrypted_data,
[0xD0,0xCF,0x11,0xE0].pack('c*') => docfile
14

Il s'est avéré qu'il existe une méthode décente dans la classe JDK de URLConnection, veuillez vous référer à la réponse suivante: Obtenir le type MIME d'un fichier en Java

Si l'on a besoin d'extraire l'extension de fichier du tableau d'octets au lieu du fichier, il faut simplement utiliser Java.io.ByteArrayInputStream (classe pour lire les octets spécifiquement dans les tableaux d'octets) au lieu de Java.io.FileInputStream (classe pour lire des octets spécifiquement à partir de fichiers) comme dans l'exemple suivant:

byte[] content = ;
InputStream is = new ByteArrayInputStream(content);
String mimeType = URLConnection.guessContentTypeFromStream(is);
 //...close stream

J'espère que cela t'aides...

38

Peut-être que je dois enregistrer une colonne supplémentaire dans ma base de données pour l'extension de fichier.

C'est une meilleure solution que d'essayer de déduire un type MIME basé sur le contenu de la base de données, pour (au moins) les raisons suivantes:

  • Si vous avez un type MIME de la source du document, vous pouvez le stocker et l'utiliser.
  • Vous pouvez (potentiellement) demander à l'utilisateur de spécifier un type MIME lorsqu'il dépose le document.
  • Si vous devez utiliser un schéma heuristique pour déterminer un type de mime:
    • vous pouvez effectuer le travail une fois avant de créer la ligne du tableau, plutôt que N fois après son extraction, et
    • vous pouvez signaler des cas où l'heuristique ne donne pas de bonne réponse, et peut-être demander à l'utilisateur de dire quel est réellement le type de fichier.

(Je fais certaines hypothèses qui ne sont peut-être pas justifiées, mais la question ne donne aucun indice sur la façon dont le système plus vaste est censé fonctionner.)

2
Stephen C