45

私は、ExcelファイルをMySQLにインポートする必要があるPHPアプリケーションに取り組んでいます。そのため、Excelファイルを.csv形式に変換する必要があります。しかし、を使用してその型を取得したい場合は、mime-typeとして$_FILE['something']['type']取得します。 ここに何か問題があると思います。以下のリストを.csvファイルmime-typeとして収集したため: application/octet-stream

text/comma-separated-values,  
text/csv,  
application/csv, 
application/excel, 
application/vnd.ms-excel, 
application/vnd.msexcel

どうしたの ?

4

4 に答える 4

51

このような場合、公式の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この情報は簡単に偽造される可能性があるため、信頼しないでください。アップロードされたファイルが特定のタイプであることを確認する必要がある場合は、自分で確認する必要があります。

于 2012-08-21T19:21:32.077 に答える
22

application/octet-streammimeタイプが不明な場合は、常に使用されます。

于 2012-08-21T18:41:43.470 に答える
0

$_FILE['something']['type']ブラウザ/ユーザーOSによって入力されるため、信頼性がありません。アップロードされたファイルが目的の形式であるかどうかを判断するには、サーバー側で独自のチェックを行う必要があります。

于 2012-08-21T19:18:59.147 に答える
-1

リストしたすべてのmimeタイプは、 http://filext.com/file-extension/CSVでcsvファイルの一般的なmimeタイプとして表示されます。

つまり、基本的には、どのプログラムが.csvファイルを生成し、どのmimeタイプを使用することにしたかによって決まります。

于 2012-08-21T18:43:40.557 に答える