<?php
//include 'ChromePhp.php';
//define('CYPOCHI_MODULES', '/var/www/bin/cypochi_modules');
//error_log(print_r($_SERVER['HTTP_USER_AGENT']),"3","C:/tmp/log/debug.log");
/**
 * アルバムファイルを指定ファイル名で出力
 * 
 * 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']);
		}
//旧ポチでは、引数n省略時にDBから日本語ファイル名を取得する機能であるが、削除する。
//		}else {
//			if(preg_match('/^abm([0-9]+)\..+$/', $name, $matches)) {
//				include_once(CYPOCHI_MODULES. '/lib/adodb/adodb.inc.php');
//				include_once(CYPOCHI_MODULES. '/conf/database_cms.php');
//				$cn = NewADOConnection(CMS_DB_TYPE);
//				if(!empty($cn)) {
//					$cn->nconnect(CMS_DB_SRV, CMS_DB_USR, CMS_DB_PASSWD, CMS_DB_NAME);
//					$result = $cn->GetAll('SELECT file_name FROM album_files WHERE id = '.((integer)$matches[1]).' limit 1;');
//					if($result !== false)
//					{
//						foreach($result as $row) {
//							$newName = $row['file_name'];
//							break;
//						}
//					}
//				}
//				unset($cn);
//			}
//		}

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

		// 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);
		}
//ChromePhp::log($mime);
		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));
//ChromePhp::log(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>';
	}
}
 ?>
