<?php
/**
 * アルバムファイルを指定ファイル名で出力
 *
 * Content-type ヘッダで、アルバムファイル名から取得したMIMEを指定する。
 * Content-Disposition ヘッダで、inline（Webページとして表示可能）と
 * オリジナルファイル名（全角含む）を指定する。
 * 表示できないファイルタイプの場合は、「ダウンロードして保存」となる。
 *
 * @param
 * d = 出力対象アルバムファイルのディレクトリ（ページIDまたはニュースID）
 * f = 出力対象アルバムファイル名
 * n = 名前を付けて保存する際のデフォルトファイル名（オリジナルファイル名のencode）
 * @example
 * abm.php?d=9999&f=abm99999999.pdf&n=オリジナルファイル名.pdf
 *
 */
if(!empty($_GET['f'])){
        $dirNo = basename(urldecode($_GET['d']));
        $abmName = basename(urldecode($_GET['f']));
        $path = dirname(__FILE__). '/'. $dirNo. '/'. $abmName;
        if(file_exists($path) && preg_match("/\.php$/i", $path) !== 1) {
                if(!function_exists('getMimeType')) {
                        /**
                         * ファイル名からMIME typeを取得
                         * @param string $filename ファイル名
                         * @return string MIME type文字列
                         * @link http://php.net/manual/ja/function.mime-content-type.php
                         */
                        function getMimeType($filename) {
                                $fileext = substr(strrchr($filename, '.'), 1);
                                if (empty($fileext)) return '';
                                $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i";
                                $lines = file('/etc/mime.types');
                                if(is_array($lines)) {
                                        foreach($lines as $line) {
                                                if (substr($line, 0, 1) == '#') continue; // skip comments
                                                $line = rtrim($line) . " ";
                                                if (!preg_match($regex, $line, $matches)) continue; // no match to the extension
                                                return ($matches[1]);
                                        }
                                }
                                return ''; // no match at all
                        }
                }

                // ブラウザ判定
                $ua = '';
                if(preg_match('/MSIE/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/^Mozilla\/.*Trident.*rv: ?(\d+)/i', $_SERVER['HTTP_USER_AGENT'])) {
                        $ua = 'ie';
                } elseif(preg_match('/Edge/i', $_SERVER['HTTP_USER_AGENT']) || preg_match('/EdgA/i', $_SERVER['HTTP_USER_AGENT'])  || preg_match('/Edgios/i', $_SERVER['HTTP_USER_AGENT'])) {
                        $ua = 'edge';
                }

                $orgName = null;
                if(!empty($_GET['n'])) {
                        $orgName = urldecode($_GET['n']);
                }

                // 保存する際のファイル名を、必要に応じて補正
                $filename = '';
                if(!is_null($orgName)) {
                        $filename = $orgName;
                        $filename = str_replace('?', '', $filename);    // Windowsで保存ボタンが押せなくなるため削除
                        $filename = str_replace('/', '', $filename);    // フォルダ階層のセパレータのため削除
                        $filename = str_replace(';', '', $filename);    // HTMLヘッダーの区切り文字のため削除
                } else {
                        $filename = $abmName;
                }

                // mime-typeを取得
                $mime = getMimeType($path);
                if(empty($mime) && function_exists('finfo_open')) {
                        $finfo = finfo_open(FILEINFO_MIME_TYPE);
                        $mime = finfo_file($finfo, $path);
                        finfo_close($finfo);
                }
                if(empty($mime) && function_exists('mime_content_type')) {
                        $mime = mime_content_type($path);
                }

                header('Content-type: '. $mime);
                if (!isset($_SERVER['HTTP_USER_AGENT'])) {
                        //HTTP_USER_AGENTがない場合、
                        header('Content-Disposition: inline; filename="'. $filename. '"');
                } elseif ($ua == 'ie') {
                        // IEの場合
                        $filename = mb_convert_encoding($filename, 'SJIS');             // IEではShift-JIS固定
                        $filename = str_replace('#', '%23', $filename);                 // IEで勝手に文字変換されてしまうためデコード
                        header('Content-Disposition: inline; filename="'. $filename. '"');
                //} elseif (stristr($_SERVER['HTTP_USER_AGENT'], "Opera")) {
                //      // Operaの場合
                //      header('Content-Disposition: attachment; filename="'. $filename. '"');
                //} elseif (stristr($_SERVER['HTTP_USER_AGENT'], "Firefox")) {
                //      // FireFoxの場合
                //      if ($mime == "application/x-shockwave-flash") {
                //              header('Content-Disposition: inline; filename="'. $filename. '"');
                //      } else {
                //              header('Content-Disposition: attachment; filename="'. $filename. '"');
                //      }
                } elseif ($ua == 'edge') {
                        // Edgeの場合
                        if ($mime == "application/pdf") {
                                header('Content-Disposition: inline; filename="'. $filename .'"');
                        } else {
                                header('Content-Disposition: attachment; filename="'. $abmName. '"; filename*=UTF-8"'. rawurlencode($filename). '"');
                        }
                } else {
                        // 上記以外(FireFox, Opera, GoogleChromeなど)
                        header('Content-Disposition: inline; filename="'. $filename .'"');
                }

                // 次はメールヘッダの項目。　指定しても無視されるのでコメントアウト
                //header('Content-Transfer-Encoding: binary');

                // 「Internet Explorerでは、SSLを使用してセキュリティ保護されているWebサイトと通信する際に、強制的にno-cache要求が発行されます。」の対策
                if($ua == 'ie') {
                        header('Pragma:');
                }

                header('Content-Length: '. filesize($path));
                readfile($path);
        } else {
                header("HTTP/1.0 404 Not Found");
                header("Content-type: text/html; charset=utf-8");
                echo '<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL ' . $_SERVER["REQUEST_URI"] . ' was not found on this server.</p></body></html>';
        }
}
?>
