私はPHP ExcelファイルをMySQLにインポートする必要があるアプリケーションに取り組んでいます。したがって、Excelファイルを.csv形式に変換する必要があります。しかし、$_FILE['something']['type']
、私はapplication/octet-stream
そのMIMEタイプとして;
ここに何か問題があると思います。以下のリストを.csvファイルmime-typeとして収集したためです。
text/comma-separated-values,
text/csv,
application/csv,
application/Excel,
application/vnd.ms-Excel,
application/vnd.msexcel
どうしたの ?
このような場合には、公式のHTTP仕様が常に役立ちます。 RFC 2616 7.2.1 (強調が追加されました):
Entity-bodyを含むHTTP/1.1メッセージには、その本文のメディアタイプを定義するContent-Typeヘッダーフィールドを含める必要があります。メディアタイプがContent-Typeフィールドで指定されていない場合にのみ、受信者はそのコンテンツおよび/またはリソースを識別するために使用されるURIの名前拡張子の検査によってメディアタイプを推測しようとする場合があります。 メディアタイプが不明のままである場合、受信者はそれをタイプ「application/octet-stream」として扱う必要があります。
問題の原因は、ファイルのアップロードを受け入れるサーバー自体が、アップロードされたファイルの種類を認識していないことです。どうして?これは、ファイルを送信したHTTPメッセージに基づいてContent-Type
ヘッダーを指定し、正確なMIMEタイプを決定するためです。ブラウザーはおそらくContent-Type
ヘッダーを送信しておらず、サーバーは上記の公式HTTP仕様の抜粋に従ってapplication/octet-stream
を想定しています。ファイルをアップロードするクライアントが、アップロードするファイルのMIMEタイプを決定しないことを選択し、Content-Type: application/octet-stream
ヘッダー自体を送信した可能性もあります。
さて、これを POST file uploadsに関するPHPマニュアルエントリdocs 、次のように表示されます。
$_FILES['userfile']['type']
ファイルのMIMEタイプ(ブラウザがこの情報を提供した場合)。例は「image/gif」です。ただし、このMIMEタイプはPHP側でチェックされないため、値を許可されません。
ご覧のとおり、$_FILES['userfile']['type']
が指定されていても、クライアントから送信されたContent-Type
ヘッダーにのみ対応しています。この情報は簡単に偽装される可能性があるため、信頼してはいけません。アップロードされたファイルが特定のタイプであることをsureにする必要がある場合は、自分で確認する必要があります。
application/octet-stream
は、MIMEタイプが不明な場合に常に使用されます。
$_FILE['something']['type']
はブラウザ/ユーザーOSによって入力されているため、信頼できません。サーバー側で独自のチェックを行い、アップロードされたファイルが目的の形式であったかどうかを判断する必要があります。
リストしたすべてのMIMEタイプは、 http://filext.com/file-extension/CSV のcsvファイルの一般的なMIMEタイプとして表示されます
したがって、基本的には、どのプログラムが.csvファイルを生成し、どのMIMEタイプを使用することになったのかがわかります。