私はいくつかのファイルのアップロードのための "Content-Type"ヘッダーを埋める目的でMIMEタイプを推測する必要があります。Delphi XE2のMIMEタイプを推測する方法はありますか?
解決策が見つかりませんでした。
私はGetMimeType('C:File.jpg')
のようなものを呼び出し、image/jpg
に戻ってきます。
ベストはmultiplataform(win/osxの場合)ですが、ウィンドウの場合のみ十分です。
私はいくつかのファイルのアップロードのための "Content-Type"ヘッダーを埋める目的でMIMEタイプを推測する必要があります。Delphi XE2のMIMEタイプを推測する方法はありますか?
解決策が見つかりませんでした。
私はGetMimeType('C:File.jpg')
のようなものを呼び出し、image/jpg
に戻ってきます。
ベストはmultiplataform(win/osxの場合)ですが、ウィンドウの場合のみ十分です。
インターネットダイレクト(インディ)は、このためのクラスが含まれています
クラスTIdThreadSafeMimeTable
単位でHTTPサーバアプリケーションにIdCustomHTTPServer
コードの例:
Response.ContentType :=
Response.HTTPServer.MIMETable.GetFileMIMEType(FileName);
あなたは何種類のファイルタイプについて話していますか?たぶんサポートしたいタイプのリストを作成するだけかもしれません。
私は
を使用してファイル拡張子を取得するだけですをチェックし、それらのリストの1つをもう一度チェックしてください。ファイルにはMIMEタイプはありませんので、このファイル拡張子のリストを使用するか、ファイルヘッダーを読み取ってタイプを判別する必要があります。これは難しく、信頼性が低いものです。
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
IEは、Delphiでのデータ/ファイル(UrlMon
単位のMIMEタイプを検出するために、GetClassFileOrMime
とFindMimeFromData
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_ROOT
(FillMimeTable
を参照)を検査します。一致が見つからない場合は、application/octet-stream
が使用されます。
ContentType
がクライアント側で改ざんされ、サーバーのレジストリにも一致しない可能性があるため、ファイルがアップロードされると、サーバー側でファイルを調べ、ヘッダーに依存しないようにする必要があります-側。