LoginSignup
1
0

More than 3 years have passed since last update.

拡張子とMIMEタイプが異なる画像を一覧表示する

Last updated at Posted at 2019-09-03

拡張子とMIMEタイプが異なる画像を一覧表示する

目的

InternetExplorer 11 で画像を表示する際、
画像ファイル名の拡張子とMIMEタイプが異なると表示されない、ということがわかりました。
(例) 画像ファイル名は hoge.jpg だが、実際のMIMEタイプはPNG
参考:https://qiita.com/yuji38kwmt/items/7d7f76d53a52560bb33c

そこで、拡張子とMIMEタイプが異なる画像がどれだけ存在するか調査したときに作成したPHPファイルを紹介します。

概要

  • PHPファイルを置いてブラウザから実行できるようにする
  • glob()を使用して存在する画像ファイルのパスの一覧を取得する
  • mime_content_type()を使用して画像ファイルのMIMEタイプを取得する
  • 画像ファイルのMIMEタイプと、あらかじめ定義しておいた正しい拡張子とMIMEタイプの配列を比較する

詳細

MIMEcheck.php
<?php
// 拡張子とMIMEタイプの配列
$extension_array = array(
    'gif' => 'image/gif',
    'jpg' => 'image/jpeg',
    'jpeg' => 'image/jpeg',
    'png' => 'image/png',
    // これ以外も調査したければここに拡張子とMIMEタイプを追加する
);

// 確認ボタンが押下されたとき
if (isset($_POST['action']) && $_POST['action'] === "confirm") {
    $not_ext = [];
    $diff_ext = [];
    // glob()内のパスは調査したい画像が置かれているパスを指定
    foreach(glob('/var/www/hoge/image/*') as $file) {
        $mime = mime_content_type($file);
        $ext = substr($file, strrpos($file, '.') + 1);
        if(isset($extension_array[$ext]) === false) {
            // 「拡張子とMIMEタイプの配列」に無いもの
            $not_ext[] = $file;
        } elseif ($extension_array[$ext] !== $mime) {
            // 拡張子とMIMEタイプが異なるもの
            $diff_ext[] = $file;
        }
    }
    // メッセージを設定してリダイレクト
    $_SESSION['not_ext'] = $not_ext;
    $_SESSION['diff_ext'] = $diff_ext;
    header('Location: /MIMEcheck/');
    exit;
}
?><html>
<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta charset="utf-8">
    <title>画像のMIMEチェック</title>
    <script type="text/javascript">
        <!--
        function send(){
            document.check.submit();
            document.getElementById("confirm").disabled = "true";
            document.getElementById("confirm").value = "処理中";
        }
        // -->
    </script>
</head>
<body>
<h1>画像のMIMEチェック</h1>
<ul>
    <li>画像の拡張子と画像のMIMEタイプが異なるものを一覧で表示します</li>
</ul>
<?php if(isset($_SESSION['not_ext']) && is_array($_SESSION['not_ext']) && count($_SESSION['not_ext']) > 0) { ?>
    拡張子がjpg,jpeg,gif,png以外のもの<br>
    <p style="color: #a94442; background-color: #f2dede; border-color: #ebccd1;">
        <?php foreach ($_SESSION['not_ext'] as $val) { ?>
            <?php echo $val; ?><br>
        <?php } ?>
    </p>
    <?php unset($_SESSION['not_ext']); ?>
<?php } ?>
<?php if(isset($_SESSION['diff_ext']) && is_array($_SESSION['diff_ext']) && count($_SESSION['diff_ext']) > 0) { ?>
    画像の拡張子と画像のMIMEタイプが異なるもの<br>
    <p style="color: #a94442; background-color: #f2dede; border-color: #ebccd1;">
    <?php foreach ($_SESSION['diff_ext'] as $val) { ?>
        <?php echo $val; ?><br>
    <?php } ?>
    </p>
    <?php unset($_SESSION['diff_ext']); ?>
<?php } ?>
<form name="check" action="" method="post" enctype="multipart/form-data">
    <p><input type="button" id="confirm" value="確認" onClick="send()" /></p>
    <input type="hidden" name="action" value="confirm"/>
</form>
</body>
</html>

補足

・画像枚数が多いときはタイムアウトに注意(検証用の環境に画像を落としてから実行するなどしましょう)
・画像の変換を行いたい場合はここでわかった画像の一覧をもとにimagejpeg()などの関数を使って変換してあげましょう(変換処理はこちら:複数の画像のMIMEタイプを変換する

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0