2012-03-24 21 views
9

私はいくつかのファイルのアップロードのための "Content-Type"ヘッダーを埋める目的でMIMEタイプを推測する必要があります。Delphi XE2のMIMEタイプを推測する方法はありますか?

解決策が見つかりませんでした。

私はGetMimeType('C:File.jpg')のようなものを呼び出し、image/jpgに戻ってきます。

ベストはmultiplataform(win/osxの場合)ですが、ウィンドウの場合のみ十分です。

答えて

5

インターネットダイレクト(インディ)は、このためのクラスが含まれています

クラスTIdThreadSafeMimeTable

単位でHTTPサーバアプリケーションにIdCustomHTTPServer

コードの例:

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

あなたは何種類のファイルタイプについて話していますか?たぶんサポートしたいタイプのリストを作成するだけかもしれません。

私は

を使用してファイル拡張子を取得するだけですをチェックし、それらのリストの1つをもう一度チェックしてください。ファイルにはMIMEタイプはありませんので、このファイル拡張子のリストを使用するか、ファイルヘッダーを読み取ってタイプを判別する必要があります。これは難しく、信頼性が低いものです。

9

FindMimeFromData機能を試してみてください。

FindMimeFromDataは(現在26)別 MIMEタイプ(Known MIME Typesを参照)のためのハードコードされたテストを含んでいます。これは、指定されたバッファー にこれらのMIMEタイプのいずれかのフォーマットのデータが含まれている場合、対応するMIMEタイプを認識するように設計されているFindMimeFromData内にテスト が存在することを意味します(バッファ の内容をスキャンします)。 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; 

から

また、この記事では、それがMIME Type Detection in Internet Explorer

7

IEは、Delphiでのデータ/ファイル(UrlMon単位のMIMEタイプを検出するために、GetClassFileOrMimeFindMimeFromData APIを使用して動作します熱い参照するには)。

MIME Type Detection in Internet Explorer

CLSIDはHKEY_CLASSES_ROOT\CLSID\<clsid>\MimeTypes下のレジストリに配置することができるGetClassFileOrMimeから返されました。 (また、FileExtensions,FriendlyName)。

レジストリには、HKEY_CLASSES_ROOT\MIME\Database\Content TypeというMIMEデータベースも格納されています。

しかし、known MIME typesのリストは比較的小さいので、それをリソースXML(または何でも)として保持して、単純にそこから取得することができます。これは、WindowsとOSXの両方をサポートします。


ファイルのアップロード操作では、常にapplication/octet-streamを使用できます。
Indyはクラス(IdGlobal)であり、固定リストとレジストリHKEY_CLASSES_ROOTFillMimeTableを参照)を検査します。一致が見つからない場合は、application/octet-streamが使用されます。
ContentTypeがクライアント側で改ざんされ、サーバーのレジストリにも一致しない可能性があるため、ファイルがアップロードされると、サーバー側でファイルを調べ、ヘッダーに依存しないようにする必要があります-側。

関連する問題