![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
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") || ...
Mit MimeTypes sähe es so aus: Code: String mimeType = MimeType.getInstance().getMimeType(new File("someFile.php"));
if("application/x-httpd-php".equals(mimeType)) {...
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. |
| | |
| | Nach oben #2 |
| Erfahrener Benutzer Registriert seit: 27.02.2006
Beiträge: 146
|
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. |
| | |
| | Nach oben #3 |
| Benutzer Registriert seit: 15.11.2005
Beiträge: 75
|
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();
}
}
}
|
| | |
| | Nach oben #4 | |
| Projektleiter Registriert seit: 30.11.2005 Ort: Bottrop
Beiträge: 1.110
|
Danke. @JumperII: Zitat:
@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. | |
| | |
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
| |
Ä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 |