之前在[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']); |
之後還需要注意當按夾的存取權限設定
只是這樣一來會造成資料庫伺服器大量的負擔
但…也是沒有辦法中的辦法囉!