<?php
/*
	Copyright(c) 2010 Shift Tech Inc. All Rights Reserved.
 	http://www.shift-tech.jp/

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * ファイルアップロード用
 *
 * @author     Nobuo Nishino
 * @copyright  Shift Tech Inc.
 * @version    CVS: $Id:$
 */
class commonFile
{
	/**
	 * 画像プレ保存
	 * 編集画面-確認画面時の保存処理
	 * $_FILES['picture']["tmp_name"]のバイナリーデータをセッション$_SESSION["tmpImage"]=array('data','ext')に格納
	 * @param $frmname input type=file のname値 quickform のFileエレメントはマニュアルに非推奨と書いてあったので・・・
	 * @param $max_size 保存可能max値
	 * @param $new_w 保存する画像の幅サイズ（キャンパスの幅） //縦、幅指定された場合はできる限りそのサイズに合わせ、あふれた部分を切り抜きます。
	 * @param $new_h 保存する画像の縦サイズ（キャンパスの縦）
	 * @param $force 強制拡大縮小フラグ true, false //trueの場合は強制的に指定サイズにします。falseの場合は縮小のみ行います　//指定縦、幅ともに指定された場合は$force関係なく指定サイズにします
	 * @param $target 複数ファイル対応 カラム名 //$_SESSION["tmpImage"]['data']['カラム名']、$_SESSION["tmpImage"]['ext']['カラム名']となります
	 * @return null or err_str
	 */
	function preSave($frmname,$max_size,$new_w=null,$new_h=null,$force=false,$target=null) {
		switch($_FILES[$frmname]["error"]) {
			case 0:
				break;
			case 1:
			case 2:
				return "・画像ファイルサイズが大きすぎます<br>アップロード可能なファイルサイズは".$max_size/(1000*1000)."Mbyte未満となっております";
				break;
			case 3:
				return "・一部の画像アップロードが失敗しました";
				break;
			case 4:
				return "・アップロードされていません";
				break;
		}

		if ($_FILES[$frmname]['size'] > $max_size && $max_size != 0) {
			return "・画像ファイルサイズが大きすぎます。<br>アップロード可能なファイルサイズは".$max_size/(1000*1000)."Mbyte未満となっております";
		}
		if($this->ImgResize($_FILES[$frmname]["tmp_name"], $_FILES[$frmname]["tmp_name"], $new_w, $new_h, $force)) {
			$fp = fopen( $_FILES[$frmname]["tmp_name"], 'r' );
			$buf = null;
			if($fp){
				while (!feof($fp)) {
						$buf .= fread($fp, 8192);
				}
				fclose($fp);
				//拡張子判別
				$size = getImageSize($_FILES[$frmname]["tmp_name"]);
				switch($size[2]) {
					case 2: //jpgの場合
						$type = ".jpg";
						break;
					case 1:
						$type = ".gif";
						break;
					case 3:
						$type = ".png";
						break;
					case 6: //bmpは未サポート！
					default:
						return "・bmpはアップロードできません。";
						break;
				}
				if ($target != null) {
					$_SESSION["tmpImage"][$target]['data'] = $buf ;
					$_SESSION["tmpImage"][$target]['ext'] = $type;
				} else {
					$_SESSION["tmpImage"]['data'] = $buf ;
					$_SESSION["tmpImage"]['ext'] = $type;
				}
			} else {
				return "・テンポラリーファイルの書き込みに失敗しました";
			}
			return null;
		}
		return "・画像のリサイズに失敗しました";
	}

	/**
	 * 画像リサイズ処理
	 * JPEG・GIFの場合のみ縦幅をYサイズに縮小した比率で、縦幅を変更
	 * （縦ピクセルの指定があった場合はその値を優先）
	 * @param	$target_file	String	リサイズしたい画像ファイル（フルパスで）
	 * @param   $savepath	String  リサイズした画像の保存先（フルパス）
	 * @param $new_w 保存する画像の幅サイズ（キャンパスの幅） //縦、幅指定された場合はできる限りそのサイズに合わせ、あふれた部分を切り抜きます。
	 * @param $new_h 保存する画像の縦サイズ（キャンパスの縦）
	 * @param $force 強制拡大縮小フラグ true, false //trueの場合は強制的に指定サイズにします。falseの場合は縮小のみ行います　//指定縦、幅ともに指定された場合は$force関係なく指定サイズにします
	 * @return	boolean
	 */
	function ImgResize($target_file, $savepath, $new_w=null,$new_h=null,$force=false)
	{
		if (!$target_file || !$savepath) {
			return false;
		}
		$size = getImageSize($target_file);
		//size[2]は画像タイプです。  size[2] = 1:gif, 2:jpg, 3:png, 4:swf, 5:不明, 6:bmp
		$x = 0; //メモリ上の画像サイズ幅width
		$y = 0; //メモリ上の画像サイズ幅height
		$distx = 0; //トリミング開始点x座標
		$disty = 0; //トリミング開始点y座標
		if($new_w == null) {
			if($new_h == null) { //縦、幅指定無し
				$new_w = $size[0];
				$new_h = $size[1];
				$x = $new_w;
				$y = $new_h;
			} else { //縦指定、幅指定無しの場合
				$new_w = $size[0];
				if($force || $size[1] > $new_h) {
					$new_w = round($size[0] * $new_h/$size[1]);
				} else { //指定サイズより小さかった場合はサイズ変更なし
					$new_h=$size[1];
				}
				$x = $new_w;
				$y = $new_h;
			}
		} else { //幅指定有り
			if($new_h == null) { //幅指定あり、縦指定なし
				$new_h = $size[1];
				if($force || $size[0] > $new_w) {
					$new_h = round($size[1] * $new_w/$size[0]);
				} else { //指定サイズより小さかった場合はサイズ変更なし
					$new_w=$size[0];
				}
				$x = $new_w;
				$y = $new_h;
			} else { //指定ありありの場合は$force関係なく指定サイズにします
				//幅、縦を拡大、縮小後、あふれる可能性があるので座標の中心を取得する
				if($new_h<=$size[1]*$new_w/$size[0]){ //幅を指定サイズに拡大・縮小した際、高さがあふれる場合
					$x=$new_w;
					$y = round($size[1] * $new_w/$size[0]);
				} else if($new_w <= $size[0] * $new_h/$size[1]){ //高さを指定サイズに拡大・縮小した際、、幅があふれてしまう場合
					$x = round($size[0] * $new_h/$size[1]);
					$y = $new_h;
				}
				$distx = round($x/2 - $new_w/2); //トリミング開始点を取得する
				$disty = round($y/2 - $new_h/2);
				if($distx>0){
					$distx *=-1;
				}
				if($disty>0){
					$disty *=-1;
				}
			}
		}
		switch($size[2]) {
			case 2: //jpgの場合
				$input_img = ImageCreateFromJPEG($target_file);
				$output_img = ImageCreateTruecolor($new_w, $new_h);
				ImageCopyResampled($output_img, $input_img, $distx,$disty,0,0, $x, $y, $size[0], $size[1]);
				ImageJPEG($output_img, $savepath);
				break;
			case 1:
				$input_img = ImageCreateFromGIF($target_file);
				$transID = ImageColorTransparent($input_img);
				if($transID >= 0){
					$output_img = ImageCreate($new_w, $new_h);
					$transColor=ImageColorsForIndex($input_img, $transID);
					$trans=imagecolorallocate($output_img, $transColor['red'], $transColor['green'], $transColor['blue']);
					ImageColorTransparent($output_img, $trans);
				} else {
					$output_img = ImageCreateTruecolor($new_w, $new_h);
				}
				ImageCopyResampled($output_img, $input_img, $distx,$disty,0,0, $x, $y, $size[0], $size[1]);
				ImageGIF($output_img, $savepath);
				break;
			case 3:
				$input_img = ImageCreateFromPNG($target_file); //要GD2.01以上
				$transID = ImageColorTransparent($input_img);
				if($transID >= 0){
					$output_img = ImageCreate($new_w, $new_h);
					$transColor=ImageColorsForIndex($input_img, $transID);
					$trans=imagecolorallocate($output_img, $transColor['red'], $transColor['green'], $transColor['blue']);
					ImageColorTransparent($output_img, $trans);
				} else {
					$output_img = ImageCreateTruecolor($new_w, $new_h);
				}
				ImageCopyResampled($output_img, $input_img, $distx,$disty,0,0, $x, $y, $size[0], $size[1]);
				ImagePNG($output_img, $savepath);
				break;
			case 6: //bmpは未サポート！
			default:
				return false;
				break;
		}
		@chmod($savepath, 0644);
		ImageDestroy($input_img);
		ImageDestroy($output_img);
		return true;
	}



	/*
	 * 画像書き出し処理
	 * セッションに一時保存されている画像バイナリーデータを指定のディレクトリに書き出します
	 * ディレクトリは作成しません。コール前に作成してください。
	 * @param $data array(data,ext) 画像バイナリーデータ,拡張子
	 * @param $path ターゲットディレクトリ
	 * @param $fname ファイル名
	 */
	function putImage($data,$path,$fname) {
		if(isset($data["data"]) && isset($data["ext"]) && $path!=null && $fname!=null) {
			if($fp = @fopen($path.$fname,'w')){
				fwrite($fp, $data["data"]);
				fclose($fp);
				@chmod($path.$fname, 0644);
				return true;
			}
		}
		return false;
	}

	/*
	 * ディレクトリ削除処理
	 * ファイルがいる場合はそれも消します
	 * @param $target_dir //削除したいディレクトリのフルパス
	 */
	function AlldelDir($target_dir) {
		if ($dir = @opendir($target_dir)) {
			while(false !== ($item = readdir($dir))) {
				if($item != "." && $item != "..") {
					if(is_dir($target_dir."/".$item)) {
						if(!commonFile::AlldelDir($target_dir."/".$item)){
							return false;
						}
					} else {
						@unlink($target_dir."/".$item);
					}
				}
			}
		} else {
			return false;
		}
		closedir($dir);
		if(!@rmdir($target_dir)){
			return false;
		}
		return true;
	}
	
	/*
	 *  ディレクトリ内のファイル全削除
	 * 子ディレクトリに関しては削除しません。
	 */
	function AllDeleteFiles($target_dir) {
		if ($dir = @opendir($target_dir)) {
			while(false !== ($item = readdir($dir))) {
				if($item != "." && $item != "..") {
					if(is_file($target_dir."/".$item)) {
						@unlink($target_dir."/".$item);
					}
				}
			}
		} else {
			return false;
		}
		closedir($dir);
		return true;
	}
	

	/**
	 * ブログ用ファイルアップロード
	 * JPEG・GIFの場合のみ縦幅をYサイズに縮小した比率で、縦幅を変更
	 * （縦ピクセルの指定があった場合はその値を優先）
	 * @param	$img			object	QuickForm Fileエレメントト
	 * @param	$file_path		String	画像保存先のフルパス（最後に/は付けない）
	 * @param	$filename		string	ファイル名
	 * @param	$filesize		int		ファイルサイズ（保存ファイルサイズ上限）
	 * @return	String			アップロードしたファイル名（拡張子付）Or Flase
	 */
	function uploadImage($img, $file_path, $filename=null, $filesize=0)
	{
		//アップロード時のファイル名
		$_old_file_name = $img->getValue();
		//拡張子判定
		$type = strtolower(strrchr($_old_file_name['name'],"."));
		if ($_old_file_name['size'] > $filesize && $filesize != 0) {
			return false;
		}
		//新ファイル名の作成
		if ($filename == null) {
			$file_name = date("Ymd").mt_rand().$type;
		} else {
			$file_name = $filename.$type;
		}
		//画像保存用DIR作成
		if ($file_path != '') {
			//ディレクトリのチェック　無ければ作成
			if(!is_dir($file_path)) {
				if (!mkdir($file_path)) {
					return false;
				}
			}
		} else {
			return false;
		}
		//ファイルアップロード
		if (!$img->moveUploadedFile($file_path, $file_name)) {
			return false;
		} else {
			@chmod($file_path.$file_name, 0644);
			return $file_name;
		}
	}
}

?>