2012-03-24 11 views
9

Ho bisogno di indovinare il tipo MIME con lo scopo di riempire l'intestazione "Content-Type" per alcuni caricamenti di file.Qualche modo per indovinare il tipo mime su Delphi XE2?

Non riesco a trovare una soluzione per questo.

Desidero chiamare qualcosa come: GetMimeType('C:File.jpg') e tornare image/jpg.

Best if è multipiattaforma (per win/osx) ma sarà sufficiente se solo per Windows.

risposta

5

Internet diretta (Indy) contiene una classe per questo:

classe TIdThreadSafeMimeTable

nell'unità IdCustomHTTPServer

Esempio di codice in un'applicazione server HTTP:

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

Di quanti tipi di file stai parlando? Forse puoi semplicemente creare un elenco di tipi che vuoi supportare.

posso immaginare queste liste siano disponibili su Internet, come pure, per esempio

Basta ottenere l'estensione del file utilizzando ExtractFileExt e ricontrollare una di quelle liste. Un file non ha un tipo mime, quindi dovrai usare questo elenco di estensioni di file o determinare il tipo leggendo le intestazioni del file, che è più difficile e altrettanto inaffidabile.

9

Provare a utilizzare la funzione FindMimeFromData.

FindMimeFromData contiene i test hardcoded per (attualmente 26) tipi MIME separati (vedi Known MIME Types). Ciò significa che se un dato buffer contiene dati nel formato di uno di questi tipi MIME, esiste un test in FindMimeFromData progettato (mediante la scansione attraverso il contenuto del buffer ) per riconoscere il tipo MIME corrispondente.

da 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; 

Anche questo articolo per vedere caldo funziona MIME Type Detection in Internet Explorer

7

IE utilizza GetClassFileOrMime e FindMimeFromData API per rilevare il tipo MIME di dati/file (UrlMon unità in Delphi).

MIME Type Detection in Internet Explorer

Il CLSID tornato da GetClassFileOrMime potrebbe essere situato nel Registro di sistema HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes. (anche FileExtensions, FriendlyName).

Il registro contiene anche un database MIME in: HKEY_CLASSES_ROOT\MIME\Database\Content Type.

Ma poiché l'elenco di known MIME types è relativamente piccolo, è possibile considerarlo come una risorsa XML (o qualsiasi altra cosa) e semplicemente recuperarlo da lì. Ciò supporterà sia Windows che OSX.


Per il funzionamento di caricamento di file si può semplicemente utilizzare sempre application/octet-stream.
Indy ha classe TIdMimeTable (IdGlobal) e utilizza una lista fissa più ispezionando il registro HKEY_CLASSES_ROOT (vedere FillMimeTable). Se non viene trovata alcuna corrispondenza, viene utilizzato application/octet-stream.
Probabilmente si dovrebbe ispezionare il file contenuto sul lato server una volta che il file è stato caricato, e non fare affidamento sulle intestazioni perché lo ContentType potrebbe essere manomesso sul lato client, e anche non corrispondere con il registro sul server -lato.

Problemi correlati