Portal > Foren > Java > Allgemeine Java-Programmierung > MimeType herausfinden
Antwort
 
Themen-Optionen
Alt 07.03.2006, 21:48 Nach oben    #1
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard MimeType herausfinden

Hi. Via Google habe ich ein paar Sachen gefunden (unter anderem etwas von Sun und etwas auf Sourceforge). Beide sind für mich aber weitestgehend unbrauchbar gewesen, also hab ich mir was eigenes gebastelt.

Problem: Funktioniert nur unter Linux "perfekt".

Hintergrundwissen: Dateien haben einen speziellen "MimeType", kennt ihr wahrscheinlich alle. Ein Beispiel: PDF-Dateien haben den MimeType "application/pdf".

Ein naiver Versuch, den MimeType überflüssig zu machen, endet häufig in Code wie diesem:
Code:
String ext = FileUtils.getExtension(new File("someFile.php"));
if(ext.equals("php") || ext.equals("phtml") || ext.equals("php3") || ext.equals("php4") || ext.equals("php5") || ext.equals("inc") || ...
You got it?

Mit MimeTypes sähe es so aus:
Code:
String mimeType = MimeType.getInstance().getMimeType(new File("someFile.php"));
if("application/x-httpd-php".equals(mimeType)) {...
Grob gesagt: Viel einfacher (und sicherer).

Nun ist meine Implementation (wie die von Sun auch) trotzdem noch sehr naiv, da sie nur auf dem Vergleichen der Dateiendung basiert.
Vorteil meiner Implementation gegenüber der von Sun: Meine ist aktueller und überprüft unter Linux die globale Datei für MimeTypes (/etc/mime.types).

Und da sind wir auch schon beim Punkt angekommen: Wie kann ich das gleiche auf Windows/Mac machen? Gibt es eine solche Datei? Wenn ja: Wo? Wie sieht sie aus? Steckt sie vielleicht in der Registry? Wenn ja: Wie kann ich sie auslesen, ohne nativ werden zu müssen?

Generell möchte ich aber hinzufügen, dass das ganze jetzt nicht übermäßig eilig ist. Ich hab der Einfachheit halber meine lokale mime.types verwendet, ist also nicht so, als ob ich gar keine Infos hätte.

Bzgl. dem naiv: Die Sourceforge-Variante überprüft zusätzlich noch irgendwelche "Magic-Fields" der Dateien... oder sowas. Problem damit: Funktioniert anscheinend nur mit java.io.File (ich brauch's für org.simpleedit.vfs.VFSFile) und sieht irgendwie instabil aus (außerdem hat es ne Wagenladung an Abhängigkeiten, die kein Mensch haben will/braucht, z.B. log4j).
Generell ist das wohl aber noch besser, als das, was ich habe. Muss mich mal durch deren Quellcode wühlen...


Na ja, wäre jedenfalls toll, wenn ihr mir helfen könntet.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2006, 09:54 Nach oben    #2
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 146
Standard

Hallo,

eine aktuelle Liste findest Du unter Windows in der Registry. D.h. Du müsstest die Registry entsprechend auslesen und verarbeiten.

Darüber hinaus kann natürlich jede Anwendung Ihre eigene mime.type-verwaltung mit bringen, wie auch immer sie aussieht.

Gruß,
Jumper, the II.
JumperII ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2006, 10:14 Nach oben    #3
Benutzer
 
Registriert seit: 15.11.2005
Beiträge: 75
Standard

Unter Windows steckt die Information, welche Extension zu welchem MIME-Type gehört, in der Registry: unter HKEY_CLASSES_ROOT gibt es Einträge für die diversen Extensions. Bei den Extensions, für die es einen MIME-Type gibt, existiert dann ein Eintrag in der Form:
Name: ContentType
Type: REG_SZ
Wert: <hier steht dann der MIME-Type>

Bsp: Arbeitsplatz\HKEY_CLASSES_ROOT\.gif:
Name: ContentType
Type: REG_SZ
Wert: image/gif

Dies und weitere Details zur Ermittlung des MIME-Types im IE findet man unter http://msdn.microsoft.com/workshop/networking/moniker/overview/appendix_a.asp

Das Auslesen von Registry-Einträgen kann man ohne Native-Code (aber natürlich trotzdem nicht plattformunabhängig) mit einem Umweg lösen:
zumindest ab Windows 2000 gibt es den Befehl reg, für ältere Version kann man reg.exe als separates Tool bekomme (glaube ich).

Das kann man dann z.B. so integrieren:
Code:
import java.io.*;

public class Test {

static class ProcessStreamReader extends Thread {
    private InputStream is;
    private StringWriter wrtr;
    private String res;

    ProcessStreamReader(InputStream is) {
      this.is = is;
      wrtr = new StringWriter();
      start();
    }

    public void run() {
    
      try {
        int c;
        while ((c = is.read()) != -1) wrtr.write(c);
      } catch ( IOException e) {
        throw new RuntimeException( e);
      }
    }

    String getResult() throws InterruptedException {
        if ( res == null) {
            join();
            res = wrtr.toString().trim();
        }
        return res;
    }
}

    public static void main( String[] args) {
        try {
            
            final String REG_SZ = "REG_SZ";
            
            Process process = Runtime.getRuntime().exec("reg query HKEY_CLASSES_ROOT\\." + args[0] + " /v \"Content Type\"");
    
            ProcessStreamReader stdout = new ProcessStreamReader(process.getInputStream());
            ProcessStreamReader stderr = new ProcessStreamReader(process.getErrorStream());

            if ( process.waitFor() != 0) throw new Exception( stderr.getResult());
    
            String result = stdout.getResult();
            int p = result.indexOf( REG_SZ);
            if ( p < 0) throw new Exception( "Unexpected result format in " + result);
 
            String contentType =  result.substring( p + REG_SZ.length()).trim();
            
            System.out.println( "contentType:" + contentType);
            
        } catch ( Exception e) {
            e.printStackTrace();
        }
        
    }
}
Das Programm erwartet eine Extension (ohne ".") als Parameter und gibt den zug. MIME-Type aus (sofern einer gefunden wurde).
Murray ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 08.03.2006, 12:13 Nach oben    #4
Projektleiter
 
Registriert seit: 30.11.2005
Ort: Bottrop
Beiträge: 1.110
Standard

Danke.

@JumperII:
Zitat:
Darüber hinaus kann natürlich jede Anwendung Ihre eigene mime.type-verwaltung mit bringen, wie auch immer sie aussieht.
Klar, mache ich auch zusätzlich, nur wollte ich eben hierarchisch vorgehen (meine eigene Verwaltung - die der User definiert - => Lokaler User-Krams (~/.mime.types) => systemweite Einstellungen). Das ist, denke ich, am sinnvollsten.

@Murray: Danke. Werd ich wohl gleich mal nach Windows wechseln, und gucken, ob ich vielleicht doch native gehe.
Plattformunabhängig muss es ja nicht wirklich sein.
pago ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Seitennummer eines Eintrags herausfinden robo47 Datenbanken 4 20.10.2006 13:07
Herausfinden, wie ein existierendes Objekt heißt Ben PHP-Programmierung 7 08.03.2006 18:34
Objekttyp herausfinden $traight-$hoota PHP-Programmierung 11 27.01.2006 12:56
per Telefonnummer Adresse herausfinden Ben Plauderecke 5 12.01.2006 08:57
Zuverlässig Herkunftsland herausfinden Buhmann PHP-Programmierung 6 15.10.2005 14:20


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:21 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44