[php] 把FLASH存入mysql後讀出

LINEで送る
[`evernote` not found]

之前在[flash lite 2.0 & php]在flash lite中動態換圖片中說過如何用swfed取代swf中的圖片,
但是由於這次的案子不是採用叢集伺服器
而是在前端的各個網頁伺服器中全部放入檔案
共用的只有資料庫伺服器
而使用者會在每次存取時被分配到不同的前端伺服器
也就是說
試用者A在B伺服器產生好的檔案
在試用者A下次存取相同位址的檔案時
有非常大的可能跑到伺服器C去
當然也就找不到東西…..

為了解決這個問題
只好再生成檔案同時把swf拆開存到共用的資料庫中(不是只有路徑)
在下次存取時
在透過共用的資料庫把他讀出來

function replace_swfjpg($swf_filename,$jpeg_filename,$image_id,$res_filename){
			$swfdata = file_get_contents($swf_filename);
			$jpegdata = file_get_contents($jpeg_filename);
 
			if (! empty($alpha_filename)) {
				$alphadata = file_get_contents($alpha_filename);
			}
 
			$swfObj = new SWFEditor();
			if ($swfObj->input($swfdata) == false) {
				fprintf(STDERR, "input failed\n");
				exit(1);
			}
 
			if (empty($alphadata)) {
				$result = $swfObj->replaceJpegData($image_id, $jpegdata);
			} else {
				$result = $swfObj->replaceJpegData($image_id, $jpegdata, $alphadata);
			}
 
			if ($result == false) {
				fprintf(STDERR, "replaceJpegdata($image_id, ...) failed\n");
				exit(1);
			}
 
			//一度ファイルを削除する
			if(file_exists($res_filename)){
				unlink($res_filename);
			}
 
			//ファイルを書き込む
			if (!($fp = fopen($res_filename,'w'))) {
				return;
			}
			$size = fwrite($fp, $swfObj->output());
		}
 
function change_bossjpeg($player1card, $player2card, $player3card, $bosscard, $bossimg){
			$path = "/var/www/html/app/app/";
			$path2 = "/var/www/html/app";
			$filename1 = $path."bossOriginal.swf";
			$filename2 = $path."bossTMP.swf";
			//bossIMG
			$this->replace_swfjpg(filename1,$path2.$bossimg,148,$filename2);
 
			for($i = 0; $i < 5; $i++){
			//player1
				$this->replace_swfjpg($filename2,$path2.$player1card[$i],90+$i*2,$filename2);
			//player2
				$this->replace_swfjpg($filename2,$path2.$player2card[$i],79+$i*2,$filename2);
			//player3
				$this->replace_swfjpg($filename2,$path2.$player3card[$i],68+$i*2,$filename2);
			}
 
			//wazaIMG
			$this->replace_swfjpg($filename2,$path2.$player1card['btlChara_img'],1,$filename2);
			$this->replace_swfjpg($filename2,$path2.$player2card['btlChara_img'],3,$filename2);
			$this->replace_swfjpg($filename2,$path2.$player3card['btlChara_img'],5,$filename2);
 
			//DBに保存する
			$now = date("Y-m-d H:i:s");
			$image = base64_encode(file_get_contents($filename2));
			$column = "user_id, swf_flag, swf_data, create_time";
			$values = $player1card['user_id'].", 1, '".$image."', '".$now."'";
			$tbl = "swf_master";
			$this->insert($column,$values,$tbl);
		}

取用時:

$batObj->change_bossjpeg($swfArr[0], $swfArr[1], $swfArr[2], $swfArr[3], $mission[0]['chara_img']);
 
    $column = "swf_data";
	$tbl = "swf_master";
	$where = "user_id = ".$myinfo[0]['user_id']." and swf_flag = 1 order by create_time desc";
	$swf_data = $batObj->select($column,$tbl,$where);
    header('Content-type: application/x-shockwave-flash;');
    print base64_decode($swf_data[0]['swf_data']);

之後還需要注意當按夾的存取權限設定
只是這樣一來會造成資料庫伺服器大量的負擔
但…也是沒有辦法中的辦法囉!