2009-12-16 9 views
25

Ich habe eine Webseite, die zum Hochladen von Dateien verwendet werden kann.
Jetzt muss ich überprüfen, ob der Dateityp korrekt ist (zip, jpg, pdf, ...).

Ich kann den MimeType verwenden, der mit der Anfrage kommt, aber ich traue dem Benutzer nicht und möchte sagen, dass ich sicher sein möchte, dass niemand eine .gif-Datei hochladen kann, die in .jpg
umbenannt wurde In diesem Fall sollte ich die magic number inspizieren.
This ist eine Java-Bibliothek, die ich gefunden habe, scheint zu erreichen, was ich brauche 'extrahieren Sie den Mimetyp von der magischen Zahl'.
Ist das eine richtige Lösung oder was schlagen Sie vor?HowTo MimeType aus einem Byte extrahieren []

UPDATE: Ich habe die mime-util project gefunden und es scheint sehr gut und up-to-date! (Vielleicht besser als Java Mime Magie Library?)
Here is a list von Utility Projekte, die Ihnen helfen können, Mime-Typen zu extrahieren

Antwort

22

Versuchen Java Mime Magic Library

byte[] data = ... 
MagicMatch match = Magic.getMagicMatch(data); 
String mimeType = match.getMimeType(); 
+1

Es ist nicht docx-Dateien richtig erkennt .. es hält was application/zip als MIME-Typ ... –

+0

@ OscarPérez A docx ist in der Tat ein Zip-Archiv ein, enthaltend Bündel von XML-Dateien, so ist es technisch korrekt. Sie können das Archiv selbst überprüfen, um festzustellen, ob es sich um ein docx oder ähnliches handelt. Dies würde wahrscheinlich für diese kleine Bibliothek nicht in Betracht kommen. – sfussenegger

+0

@sfussenegger Was können Sie zu dieser SO-Frage sagen? [Datei des MIME-Typs mit JMimeMagic überprüfen] (http://StackOverflow.com/questions/15325047/check-file-of-mime-type-with-jmimemagic)? –

-2

Die Aktivierung Rahmen Sun's answer to this ist. Und vielleicht hast du das schon im Klassenpfad deines Appservers

+0

Ich habe getContentType() des Aktivierungsframeworks über einige .pdf, .xls Dateien versucht, aber die Methode gibt immer 'application/octet-stream' zurück. nur für .txt gibt etwas wie 'text/plain' – mickthompson

+1

eigentlich die getContentType nur die Datei basiert auf der Dateierweiterung und eine Karte von MimeType, die Sie zur Verfügung stellen ... das ist nicht das, was ich suche – mickthompson

+0

Ich stimme zu, das ist nicht was du suchst! –

8

Ich bin sicher, die von @sfussenegger gepostete Library ist die beste Lösung, aber ich mache es mit dem folgenden Snippet von Hand, von dem ich hoffe, dass es dir helfen könnte .

DESCONOCIDO("desconocido", new byte[][] {}), PDF("PDF", 
      new byte[][] { { 0x25, 0x50, 0x44, 0x46 } }), JPG("JPG", 
      new byte[][] { { (byte) 0xff, (byte) 0xd8, (byte) 0xff, 
        (byte) 0xe0 } }), RAR("RAR", new byte[][] { { 0x52, 
      0x61, 0x72, 0x21 } }), GIF("GIF", new byte[][] { { 0x47, 0x49, 
      0x46, 0x38 } }), PNG("PNG", new byte[][] { { (byte) 0x89, 0x50, 
      0x4e, 0x47 } }), ZIP("ZIP", new byte[][] { { 0x50, 0x4b } }), TIFF(
      "TIFF", new byte[][] { { 0x49, 0x49 }, { 0x4D, 0x4D } }), BMP(
      "BMP", new byte[][] { { 0x42, 0x4d } }); 

Grüße.

PD: Das Beste daran ist, dass es keine Abhängigkeit hat. PD2: Keine Garantie für die Richtigkeit! PD3: "desconocido" steht für "unbekannt" (in Spanisch)