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

/**
 * ファイルアップロード用
 *
 * @author     Nobuo Nishino
 * @copyright  BEATUP Inc.
 * @version    CVS: $Id:$
 */
class fileUpload
{
	/**
	 * 画像プレ保存
	 * 編集画面-確認画面時の保存処理
	 * $_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 1://gifの場合
						$type = ".gif";
						break;
					case 2: //jpgの場合
						$type = ".jpg";
						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;
		}
		ImageDestroy($input_img);
		ImageDestroy($output_img);
		return true;
	}



	/*
	 * 画像書き出し処理
	 * セッションに一時保存されている画像バイナリーデータを指定のディレクトリに書き出します
	 * ディレクトリは作成しません。コール前に作成してください。
	 * @param $data array(data,ext) 画像バイナリーデータ,拡張子
	 * @param $path ターゲットディレクトリ /usr/local/apache2/htdocs/0465/www/pc/global-image/usr-prof/11/
	 * @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);
				return true;
			}
		}
		return false;
	}

//Nishino Add 2007.10.16
	/*
	 * 画像書き出し処理（複数ファイル対応）
	 * セッションに一時保存されている画像バイナリーデータを指定のディレクトリに書き出します
	 * ディレクトリは作成しません。コール前に作成してください。
	 * @param $data array(data,ext) 画像バイナリーデータ,拡張子
	 * @param $path ターゲットディレクトリ /usr/local/apache2/htdocs/0465/www/pc/global-image/usr-prof/11/
	 * @param $fname ファイル名
	 * @param $varname ファイル保存カラム名
	 */
	function putImageMulti($data,$path,$fname,$varname) {

		$data = isset($data["data"]) ? $data["data"] : '';
		$ext  = isset($data["ext"]) ? $data["ext"] : '';

		if($data != '' && $ext != '' && $path!=null && $fname!=null) {
			if($fp = @fopen($path.$fname,'w')){
				fwrite($fp, $data);
				fclose($fp);
				return true;
			}
		}
		return false;
	}
//Nishino Add End 2007.10.16

	/*
	 * ディレクトリ削除処理
	 * ファイルがいる場合はそれも消します
	 * @param $target_dir //削除したいディレクトリのフルパス
	 */
	function deleteDir($target_dir) {
		$dir = @opendir($target_dir);
		if($dir) {
			while($file = readdir($dir)) {
				if(ereg("(([a-z0-9]+)\.(jpg|gif|png))", $file)){
			        @unlink( $target_dir.$file );
			    }
			}
			closedir($dir);
			@rmdir($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;
	}


	/**
	 * ブログ用ファイルアップロード
	 * 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 {
			return $file_name;
		}
	}

	/**
	 * ファイルは臨時フォルダーから実績フォルダーに複製する
	 * @param	$file_path_sour
	 * @param	$file_name_sour
	 * @param	$file_path_dest
	 * @return	true/false
	 */
	function copyImage($file_path_sour, $file_name_sour, $file_path_dest)
	{
		//画像元フォルダーをチェックする
		if($file_path_sour == '' || $file_name_sour == ''){
			return false;
		}

		//画像先フォルダーをチェックする
		if ($file_path_dest != '') {
			//ディレクトリのチェック　無ければ作成
			if(!is_dir($file_path_dest)) {
				if (!mkdir($file_path_dest)) {
					return false;
				}
			}
		} else {
			return false;
		}
		//ファイルアップロード
		$rtn = copy($file_path_sour . '/' . $file_name_sour, $file_path_dest . '/' . $file_name_sour);
		//元ファイルを削除します。
		@unlink($file_path_sour . '/' . $file_name_sour);
		if ($rtn) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * ファイル名前(拡張子付)によって、ファイルアップロードアドレスを取る
	 * @param   $filename ファイル名前(拡張子付)
	 * @return	array
	 */
	function getFilePath($filename){
		if($filename == null){
			return null;
		}

		$file_name = explode(".", $filename);
		if(isset($file_name[1])&&$file_name[1] != '') {
			//ファイル拡張子大文字を小文字に変換する
			$file_type = strtolower($file_name[1]);
			switch($file_name[1]){
//				case "jpg":
//				case "png":
//				case "gif":
//					$file_path['tmp_path'] = '/global-image/units/img_tmp';
//					$file_path['real_path'] = '/global-image/units/img';
//					break;
//				case "swf":
//				case "flv":
//					$file_path['tmp_path'] = '/global-image/units/swf_tmp';
//					$file_path['real_path'] = '/global-image/units/swf';
//					break;
				default:
					//其の他場合
					$file_path['tmp_path'] = '/global-image/units/upfiles_tmp';
					$file_path['real_path'] = '/global-image/units/upfiles';
					break;
			}//switch
		}else{
			return null;
		}
		return $file_path;
	}
}

?>