*/ class DownloadController extends Controller { public function down_error($message='') { $this->assign("message",$message); $this->display(); } public function index($game_id=0,$promote_id=0){ $applyModel = M('Apply','tab_'); $map['status'] = 1; $map['enable_status'] = 1; $data = $applyModel ->field('game_id,tab_apply.game_name,promote_id,promote_account,relation_game_id,pack_url,plist_url,`status`,enable_status,tab_apply.sdk_version') ->join("tab_game ON tab_apply.game_id = tab_game.id AND promote_id = $promote_id AND game_id = $game_id ") ->where($map) ->find(); $system_type = 1; if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){ $system_type = 2; } $gamemodel = new GameModel(); $source = $gamemodel->getGameDownInfo($game_id); $pack_url = $this->package($source['packet'],$promote_id); M('Game','tab_')->where('id='.$data['game_id'])->setInc('dow_num'); if(is_mobile_request()){ if($data['sdk_version'] == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载")); // if($data['sdk_version'] == 1 && is_weixin()) $this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载")); if($data['sdk_version'] == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载")); } switch ($data['sdk_version']) { case 1: if(!empty($pack_url)){ if(preg_match("/oss/", $pack_url)){ $url=str_replace('-internal', '', $pack_url); echo ""; }elseif(preg_match("/clouddn/", $pack_url)){ $url = "http://".$pack_url; redirect($url); }elseif(preg_match("/myqcloud/", $pack_url)){ redirect($pack_url); }elseif(preg_match("/bcebos/", $pack_url)){ redirect($pack_url); }else{ if (!file_exists($pack_url)){ $this->error('文件不存在哦 亲!'); }else{ redirect("http://".$_SERVER['HTTP_HOST'].ltrim($pack_url,'.')); } } }else{ $this->error('原包地址不存在'); } break; default: switch ($system_type) { case 1: if(!empty($pack_url)){ if(preg_match("/oss/", $pack_url)){ $url=str_replace('-internal', '', $pack_url); echo ""; }elseif(preg_match("/clouddn/", $pack_url)){ $url = "http://".$pack_url; redirect($url); }elseif(preg_match("/myqcloud/", $pack_url)){ redirect($pack_url); }elseif(preg_match("/bcebos/", $pack_url)){ redirect($pack_url); }else{ $this->down($pack_url); } }else{ $this->error('原包地址不存在'); } break; default: $plist_url = substr($data['plist_url'],'1',strlen($data['plist_url'])); Header("HTTP/1.1 303 See Other"); Header("Location: "."itms-services://?action=download-manifest&url="."https://".$_SERVER["HTTP_HOST"]."/".$plist_url); break; } break; } } /** * 投放包下载 * @param * @author 鹿文学 */ public function launch_down_file($game_id=0,$promote_id=0,$platform_id=0,$position=1) { /* 检查游戏是否存在 */ //$game = M('game','tab_')->field('id,game_name')->where(['id'=>$game_id])->find(); //if(!is_array($game)) {$this->error('游戏不存在');} /* 检查渠道包是否存在或更改 */ $applymodel = M('apply','tab_'); $apply = $applymodel->field('id,sdk_version,pack_url,plist_url') ->where(['game_id'=>$game_id,'promote_id'=>$promote_id])->find(); //if(!is_array($apply)) {$this->error('渠道不存在');} $launchmodel = M('apply_launch','tab_'); $map = array( 'platform_id'=>$platform_id, 'apply_id'=>$apply['id'], 'position'=>$position, ); $launch = $launchmodel->where($map)->find(); //if(!is_array($launch)) {$this->error('游戏包不存在');} /* 检查原包是否存在或更改 */ $gamesource = M('game_source','tab_')->field('id,file_name,source_version')->where(['game_id'=>$game_id])->find(); if(!is_array($gamesource)) {$this->error('文件不存在哦');} if($gamesource['file_name'] == $launch['game_source_filename']) { $system_type = 1; if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){ $system_type = 2; } $pack_url = $launch['launch_down_url']; M('Game','tab_')->where(['id'=>$game_id])->setInc('dow_num'); if(is_mobile_request()){ if($apply['sdk_version'] == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载")); if($apply['sdk_version'] == 1 && is_weixin())$this->redirect("Home/promotionofregistration",array('pid'=>$promote_id,'gid'=>$game_id,'lid'=>$platform_id,'p'=>$position,'message'=>"请使用安卓浏览器下载")); if($apply['sdk_version'] == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载")); } switch ($apply['sdk_version']) { case 1: if(!empty($pack_url)){ if(preg_match("/oss/", $pack_url)){ $url=str_replace('-internal', '', $pack_url); echo ""; }elseif(preg_match("/clouddn/", $pack_url)){ $url = "http://".$pack_url; redirect($url); }elseif(preg_match("/myqcloud/", $pack_url)){ redirect($pack_url); }elseif(preg_match("/bcebos/", $pack_url)){ redirect($pack_url); }else{ $url = ROOTTT . substr($pack_url,stripos($pack_url,'uploads')); if (!file_exists($url)){ $this->error('文件不存在哦 亲!'); }else{ redirect($pack_url); } } }else{ $this->error('原包地址不存在'); } break; default: switch ($system_type) { case 1: if(!empty($pack_url)){ if(preg_match("/oss/", $pack_url)){ $url=str_replace('-internal', '', $pack_url); echo ""; }elseif(preg_match("/clouddn/", $pack_url)){ $url = "http://".$pack_url; redirect($url); }elseif(preg_match("/myqcloud/", $pack_url)){ redirect($pack_url); }elseif(preg_match("/bcebos/", $pack_url)){ redirect($pack_url); }else{ $this->down($pack_url); } }else{ $this->error('原包地址不存在'); } break; default: $plist_url = $launch['launch_plist_url']; if(stripos($plist_url,'https://') === false) { $plist_url = 'https://'.$_SERVER['HTTP_HOST'].str_replace('./','/',$plist_url); } Header("HTTP/1.1 303 See Other"); Header("Location: "."itms-services://?action=download-manifest&url=".$plist_url); break; } break; } } else { $applymodel->where(['id'=>$apply['id']])->setField('enable_status',2); $this->error('游戏正在打包,请稍候'); } } public function media_down_file($game_id=0,$type=1){ $model = M('Game','tab_'); $map['tab_game.id'] = $game_id; $map['file_type'] = $type; $data = $model ->field('tab_game_source.*,tab_game.game_name,tab_game.add_game_address,tab_game.ios_game_address') ->join("left join tab_game_source on tab_game.id = tab_game_source.game_id")->where($map)->find(); if($type==1){ if($data['file_url']!=''||!varify_url($data['add_game_address'])){ $this->down($data['file_url']); } else{ Header("HTTP/1.1 303 See Other"); Header("Location: ".$data['add_game_address']); } }else{ if($data['file_url']!=''||!varify_url($data['ios_game_address'])){ $this->down($data['file_url']); } else{ Header("HTTP/1.1 303 See Other"); Header("Location: ".$data['ios_game_address']); } } } public function down($file, $isLarge = false, $rename = NULL) { if(headers_sent())return false; if(!$file) { $this->error('文件不存在哦 亲!'); } if($rename==NULL){ if(strpos($file, '/')===false && strpos($file, '\\')===false) $filename = $file; else{ $filename = basename($file); } }else{ $filename = $rename; } header('Content-Description: File Transfer'); header("Content-Type: application/force-download;"); header('Content-Type: application/octet-stream'); header("Content-Transfer-Encoding: binary"); header("Content-Disposition: attachment; filename=\"$filename\""); header('Expires: 0'); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: public'); header('Content-Length: '.filesize($file));//$_SERVER['DOCUMENT_ROOT']. header("Pragma: no-cache"); //不缓存页面 ob_clean(); flush(); if($isLarge) self::readfileChunked($file); else readfile($file); } public function down_material($game_id){ $map['status'] = 1; $game = M("game",'tab_')->where($map)->find($game_id); $material = $game['material_url']; if(file_exists($material) && is_file($material)){ clearstatcache(); $this->down($material); }else{ clearstatcache(); $this->error('下载地址错误'); } } /** * 安卓打包渠道信息 * @param $source_info 原包信息 * @param $promote_id * @return string * author: xmy 280564871@qq.com */ public function package($source_info, $promote_id) { $file_path = $source_info['file_url']; //验证原包是否存在 if (!varify_url($file_path)) { $this->error("未上传原包"); } else { $result = M('apply', 'tab_') ->alias('a') ->field('id, pack_url, plist_url') ->where(['a.game_id'=>$source_info['game_id'],'a.promote_id'=>$promote_id]) ->find(); if(empty($result)) { $this->error('此游戏不存在'); } if(GameModel::ANDROID == $source_info['sdk_version']){ if(varify_url($result['pack_url'])) { return $result['pack_url']; } }elseif(GameModel::IOS == $source_info['sdk_version']){ if(varify_url($result['plist_url'])) { return $result['plist_url']; } }else{ $this->error('游戏版本错误'); } } } }