- 締切済み
Powerpoint形式を判別できません
現在、PHPにてファイルアップロードの機能を実装しています。 PowerPoint形式のファイルをアップロードさせるために、 PowerPoint形式以外のファイルをアップロード禁止制限を掛けようと考えています。 下記のような分岐処理をしても、2003形式の .ppt 形式のファイル、 2007形式の .pptx 形式のファイルを判別する事ができません。 2003、2007それぞれのMIME設定で、これらのファイル形式を判別するにはどうすればよろしいでしょうか? # PowerPoint2003形式のファイルではないか? if( $imgFileType != "application/vnd.ms-powerpoint" ) { # PowerPoint2007形式のファイルではないか? if( $imgFileType != "application/vnd.openxmlformats-officedocument.presentationml.presentation" ) { (エラーメッセージ『アップロードできないファイル形式です。』を表示) } } によりファイル形式を判別させているのですが、 予期した通りに動作せず、どちらのファイル形式をアップロードしても 『アップロードできないファイル形式です。』のエラーとなってしまいます。 MIMEタイプの変数 $imgFileType の値が、 PowerPoint2003形式のファイル(拡張子 .ppt)をアップロードした場合、"application/octet-stream" PowerPoint2007形式のファイル(拡張子 .pptx)をアップロードした場合、"application/x-zip-compressed" として格納されてしまいます。 アップロード先は、ロリポップのレンタルサーバで PHPのバージョン = 5.2.17 となっています。 ご教授いただければ幸いです。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- 1minn
- ベストアンサー率57% (52/90)
$imgFileTypeはどのように取得してますか? そこに問題がありそうな気はしますが・・・ ただ、どのような方法でMime-typeを取得してもそれを100%信頼するのは難しいようです。 http://www.php.net/manual/ja/features.file-upload.post-method.php PHPマニュアルにも載っていますが、ブラウザが正しいmime-typeを送信してくる保証がありません。 また、WEBサーバー側がmime-typeを正しく判定していない可能性もあるかもしれません。 ロリポップがどのような設定を行ってるかによります。 apacheのconfやmime.typesを直接触る事が出来ればよいのですが、難しいですよね。 http://jp2.php.net/manual/ja/function.mime-content-type.php 非推奨になっているようですがmime_content_typeという関数で判別が出来るようですね。 (代わりに推奨してる関数は5.3以降なので使えないと思います) どちらにしてもファイルの偽装などを含め、完全な確認は難しいのではないでしょうか? 私なら今回の環境であれば、制限は拡張子のチェック程度で済ませるかな・・・
補足
こちらの一方的な都合で返信を遅らせてしまい、大変申し訳ございません。 > $imgFileTypeはどのように取得してますか? > そこに問題がありそうな気はしますが・・・ $imgFileType の取得処理は、 $imgFileType = $_FILES['material']['type']; として、PHP側から渡されたMIMEタイプの値を、 そのままの形で格納させています。