2012-03-24 13 views
9

Muszę odgadnąć typ MIME w celu wypełnienia nagłówka "Content-Type" dla niektórych plików.Jakikolwiek sposób odgadnięcia typu MIME na Delphi XE2?

Nie udało mi się znaleźć rozwiązania.

Chciałbym zadzwonić na coś takiego: GetMimeType('C:File.jpg') i wrócić image/jpg.

Najlepsze, jeśli jest multiplataform (dla win/osx), ale będzie wystarczające, jeśli tylko dla okien.

Odpowiedz

5

Internet Direct (Indy) zawiera klasę dla tego:

klasa TIdThreadSafeMimeTable

w jednostce IdCustomHTTPServer

przykład kodu w aplikacji serwera HTTP:

Response.ContentType := 
    Response.HTTPServer.MIMETable.GetFileMIMEType(FileName); 
5

Ile typów plików mówisz? Może po prostu stworzysz listę typów, które chcesz wspierać.

mogę sobie wyobrazić tych list będzie dostępna w internecie, a także, na przykład

Po prostu pobierz rozszerzenie pliku, używając ExtractFileExt i sprawdź, czy zawiera jedną z tych list. Plik nie ma typu mime, więc musisz użyć tej listy rozszerzeń plików lub określić typ, czytając nagłówki plików, co jest trudniejsze i równie niewiarygodne.

9

Spróbuj użyć funkcji FindMimeFromData.

FindMimeFromData zawiera ustalone na stałe dla testów (obecnie 26) oddzielnych typu MIME (patrz Known MIME Types). Oznacza to, że jeśli dany bufor zawiera dane w formacie jednego z tych typów MIME, istnieje test w FindMimeFromData, który został zaprojektowany (poprzez skanowanie zawartości bufora ) w celu rozpoznania odpowiedniego typu MIME.

z urlmon.pas

function FindMimeFromData(
    pBC: IBindCtx;      // bind context - can be nil 
    pwzUrl: LPCWSTR;     // url - can be nil 
    pBuffer: Pointer;     // buffer with data to sniff - can be nil (pwzUrl must be valid) 
    cbSize: DWORD;      // size of buffer 
    pwzMimeProposed: LPCWSTR;   // proposed mime if - can be nil 
    dwMimeFlags: DWORD;     // will be defined 
    out ppwzMimeOut: LPWSTR;   // the suggested mime 
    dwReserved: DWORD     // must be 0 
): HResult; stdcall; 

również w tym artykule, aby zobaczyć gorące działa MIME Type Detection in Internet Explorer

7

IE korzysta GetClassFileOrMime i FindMimeFromData API do wykrywania typu MIME danych/plików (UrlMon jednostkę w Delphi).

MIME Type Detection in Internet Explorer

Clsid wrócił z GetClassFileOrMime może znajdować się w rejestrze pod HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes. (także FileExtensions, FriendlyName).

W rejestrze znajduje się również baza danych MIME pod numerem: HKEY_CLASSES_ROOT\MIME\Database\Content Type.

Ale ponieważ lista known MIME types jest względnie mała, można ją przetrzymać jako plik XML źródła (lub cokolwiek innego) i po prostu pobrać z niego. To zapewni zarówno Windows, jak i OSX.


Do operacji przesyłania plików można po prostu zawsze użyć application/octet-stream.
Indy ma klasę TIdMimeTable (IdGlobal) i używa stałej listy oraz inspekcji rejestru HKEY_CLASSES_ROOT (patrz FillMimeTable). Jeśli nie zostanie znalezione dopasowanie, zostanie użyty application/octet-stream.
Prawdopodobnie powinieneś chcieć sprawdzić plik zawartość po stronie serwera po przesłaniu pliku, a nie polegać na nagłówkach, ponieważ ContentType może zostać naruszone po stronie klienta, a także nie pasuje do rejestru na serwerze -bok.

Powiązane problemy