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




