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?
S'il s'agit de stocker un fichier qui est téléchargé:
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
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...
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:
(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.)