質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

解決済

PHPでアップロードしたファイルの確認方法について教えてください。

7968
7968

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

2回答

0評価

0クリップ

3357閲覧

投稿2017/04/18 01:45

編集2022/01/12 10:58

現在、ファイルのアップロードについて網羅的に調べています。

私が調べた限り、アップロードしたファイルのMIMEタイプを確認できる関数まはたクラスは5つありました。

それぞれ、バージョンまたは拡張の有無によって使えるか変わるので、2つのXAMPP環境で動作を確認しました。

それぞれの結果が下記です。

関数XAMPP 1.6.1(PHP 5.2.1)XAMPP 1.7.3(PHP 5.3.1)
[mime_content_type](http://php\.net/manual/ja/function\.mime-content-type\.php\)×
[finfo クラス](http://php\.net/manual/ja/class\.finfo\.php\)×
[fileinfo 関数](http://php\.net/manual/ja/ref\.fileinfo\.php\)×
[getimagesize](http://php\.net/manual/ja/function\.getimagesize\.php\)
[exif_imagetype](http://php\.net/manual/ja/function\.exif-imagetype\.php\)

**ファイルをサーバーに保存したくないので move_uploaded_file は、なるべく使いたくないと仮定します。**
(ユーザーが直接アクセスできないディレクトリに保存すればよいだけですが、今回はなるべく使わない方法を聞きたいです)

2つ質問がございます。

【質問1】テンポラリファイルのMIMEタイプは、どの関数またはクラスで確認できますか?

私の確認の仕方に問題があるかもしれませんが、下記のようにfileinfo関数では、テンポラリファイルのMIMEタイプを確認できました。

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHP</title> </head> <body> <form method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures"> <input type="submit" value="送信"> </p> </form> <\?php if\(isset\(\$_FILES\['pictures'\]\)\) { \$tmp_file_data = file_get_contents\(\$_FILES\['pictures'\]\['tmp_name'\]\); \$finfo = finfo_open\(FILEINFO_MIME\); \$mime_type = finfo_buffer\(\$finfo, \$tmp_file_data\); finfo_close\(\$finfo\); echo '<p>fileinfo 関数の値:' \. \$mime_type \. '</p>'; } \?> </body> </html>

試してはないですが、finfoクラスでも同様に確認できるかと思います。

他の関数については、\$_FILES\['pictures'\]\['tmp_name'\] を指定してもエラーが表示されます。
これらは、move_uploaded_file でファイルを移動すれば、問題なく確認できましたが、テンポラリファイルの状態では確認できませんでした。

テンポラリファイルのMIMEタイプを確認できるのは、fileinfo関数またはfinfoクラスだけですか?

【質問2】PHP5.2環境ではテンポラリファイルのMIMEタイプをどのように確認していたのでしょうか?

私が5.2環境で試したときは、getimagesize と exif_imagetype しか動作しませんでした。
私の検証結果が正しければ、これらの関数ではテンポラリファイルのMIMEタイプは確認できないです。
PHP5.2を使っていた時代でもファイルのアップロードはしていたと思います。
どのようにMIMEタイプを確認していたのでしょうか?

**考えられる方法(※調べた結果なので試してません)**

1. Fileinfoは、PHP5.3まではPECL拡張なので、追加して確認する
1. move_upload_file + getimagesize or exif_imagetype で確認する
1. file_get_contents + bin2hex でバイナリデータを取得して、自前で用意したマジックバイトシーケンスと一致するか確認する
1. [fileコマンド](https://linuxjm\.osdn\.jp/html/file/man1/file\.1\.html\)で確認する

ご存じの方いれば、教えてください((_ _ (´ω` )ペコ

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

yambejp
yambejp

2017/04/18 02:26

画像を保存しないのにアップロードさせる意味はあるのでしょうか?mime自体あくまで目安なのであまり深く考えてもしかたないと思います
7968
7968

2017/04/18 03:54 編集

掲示板のような場合だと保存する必要はあるけど、添付メールフォームのような場合だと保存は必要ないのかなと思いました。 これらの関数・クラスは、ファイル自体のマジックナンバーでMIMEを判定しているかと思います(PHPのコアファイルを読むスキルはないため、勝手な憶測)。 ここ(http://qiita\.com/rana_kualu/items/aec5c3d93e9eb2c8f0ba)に記載されている通り、簡単に騙すことは可能ですが、マジックナンバーからMIMEを判定し、リクエストメッセージのMIMEと一致するか確認したり、そこから拡張子を決めたりすることになるのかと思い、質問しました。
shi_ue
shi_ue

2017/04/18 08:52

なぜ、こんなに古いPHPのバージョンで検証しているんでしょうか?
7968
7968

2017/04/18 10:50 編集

えーと、半分は興味本位で、半分はムキーとなって調べてます。 PHPでアップロードされたファイルのMIMEタイプを確認する方法を調べたら上述した通り、5つありました。 何がどのように違うのか、ググっても一覧で説明しているところがなく、これからファイルのアップロードについて学びたいと考えている人にはわからなくね?とムキーとなって、網羅的に調べてまとめてます。 PHP5\.2と5\.3の環境で検証しているのは、5\.3でMimetype拡張モジュールが廃止され、新たにFileinfo拡張モジュールが追加されたためです。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。