2012-03-24 35 views
9

Necesito adivinar el tipo de mimo con el fin de completar el encabezado "Content-Type" para algunas cargas de archivos.¿Alguna manera de adivinar el tipo de mimo en Delphi XE2?

No he encontrado una solución para ello.

Deseo llamar a algo como: GetMimeType('C:File.jpg') y obtener image/jpg.

Mejor si es multiplataforma (para win/osx) pero será suficiente si solo para Windows.

Respuesta

5

directa a Internet (Indy) contiene una clase para esto:

clase TIdThreadSafeMimeTable

en la unidad IdCustomHTTPServer

ejemplo de código en una aplicación de servidor HTTP:

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

¿De cuántos tipos de archivos está hablando? Tal vez solo puedas crear una lista de los tipos que deseas admitir.

me puedo imaginar estas listas a estar disponible en Internet, así, por ejemplo

Obtenga la extensión de archivo usando ExtractFileExt y compruébalo contra una de esas listas. Un archivo no tiene un tipo de mime, por lo que deberá usar esta lista de extensiones de archivo o determinar el tipo leyendo los encabezados de los archivos, que es más difícil y poco confiable.

9

Intente utilizar la función FindMimeFromData.

FindMimeFromData contiene pruebas no modificables para (actualmente 26) separadas tipos MIME (ver Known MIME Types). Esto significa que si un búfer dado contiene datos en el formato de uno de estos tipos MIME, existe una prueba en FindMimeFromData que está diseñada (escaneando a través del contenido del buffer ) para reconocer el tipo MIME correspondiente.

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

También este artículo para ver el calor que funciona MIME Type Detection in Internet Explorer

7

IE utiliza GetClassFileOrMime y FindMimeFromData API para detectar el tipo MIME de datos/archivos (UrlMon unidad en Delphi)

MIME Type Detection in Internet Explorer

El CLSID regresaron de GetClassFileOrMime se podría situar en el registro bajo HKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes. (también FileExtensions, FriendlyName).

El registro también contiene una base de datos MIME en: HKEY_CLASSES_ROOT\MIME\Database\Content Type.

Pero dado que la lista de known MIME types es relativamente pequeña, puede mantenerlo como un XML de recursos (o lo que sea) y simplemente recuperarlo desde allí. Esto servirá tanto para Windows como para OSX.


Para la operación de carga de archivos, simplemente puede usar siempre application/octet-stream.
Indy tiene TIdMimeTable clase (IdGlobal) y utiliza una lista fija más la inspección del registro HKEY_CLASSES_ROOT (ver FillMimeTable). Si no se encuentra ninguna coincidencia, se usa application/octet-stream.
Probablemente desee inspeccionar el archivo contenido en el lado del servidor una vez que se cargue el archivo, y no confiar en los encabezados porque el ContentType podría ser alterado por el lado del cliente y tampoco coincidir con el registro en el servidor -lado.

Cuestiones relacionadas