You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

330 lines
13 KiB
PHP

<?php
namespace Home\Controller;
use Think\Controller;
use App\Model\GameModel;
/**
* @author elf<360197197@qq.com>
*/
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 "<script>window.location.href='$url';</script>";
}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 "<script>window.location.href='$url';</script>";
}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 "<script>window.location.href='$url';</script>";
}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 "<script>window.location.href='$url';</script>";
}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('游戏版本错误');
}
}
}
}