このような場合、公式のHTTP仕様は常に役立ちます。RFC 2616 7.2.1から(私の強調が追加されました):
エンティティ本体を含むHTTP/1.1メッセージには、その本文のメディアタイプを定義するContent-Typeヘッダーフィールドを含める必要があります。メディアタイプがContent-Typeフィールドで指定されていない場合に限り、受信者は、コンテンツやリソースの識別に使用されるURIの名前拡張子を調べてメディアタイプを推測しようとする場合があります。メディアタイプが不明なままの場合、受信者はそれをタイプ「application/octet-stream」として扱う必要があります。
問題の原因は、ファイルのアップロードを受け入れるサーバー自体が、アップロードされたファイルのタイプを認識していないことです。なんで?これは、ファイルを送信したHTTPメッセージに依存してContent-Type
ヘッダーを指定し、正確なmimeタイプを判別するためです。ブラウザはContent-Type
ヘッダーを送信していない可能性があり、サーバーはapplication/octet-stream
上記の公式HTTP仕様の抜粋に従って想定しています。また、ファイルをアップロードしているクライアントが、アップロードしているファイルのmimeタイプを判別せず、Content-Type: application/octet-stream
ヘッダー自体を送信することを選択した可能性もあります。
さて、これをPOSTファイルアップロードドキュメントに関するPHPマニュアルエントリと併せて検討すると、次のようになります。
$_FILES['userfile']['type']
ブラウザがこの情報を提供した場合は、ファイルのmimeタイプ。例は「image/gif」です。ただし、このmimeタイプはPHP側でチェックされないため、その値を当然のこととは見なしません。
ご覧のとおり、が指定されていても、クライアントから送信され$_FILES['userfile']['type']
たヘッダーにのみ対応します。Content-Type
この情報は簡単に偽造される可能性があるため、信頼しないでください。アップロードされたファイルが特定のタイプであることを確認する必要がある場合は、自分で確認する必要があります。