download.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. /*
  3. * Krpano100 下载功能
  4. * ============================================================================
  5. * 技术支持:2015-2099 成都世纪川翔科技有限公司
  6. * 官网地址: http://www.krpano100.com
  7. * ----------------------------------------------------------------------------
  8. * $Author: wanghao 932625974#qq.com $
  9. * $Id: bind.php 28028 2016-06-19Z yuanjiang $
  10. */
  11. if(!defined('IN_T')){
  12. die('hacking attempt');
  13. }
  14. //引用下载类
  15. require_once ROOT_PATH.'source/include/cls_project_download.php';
  16. require_once ROOT_PATH.'source/include/cls_file_util.php';
  17. $act = Common::sfilter($_REQUEST['act']);
  18. //准备压缩包
  19. if($act == 'build'){
  20. //设置该次请求超时时长,1800s
  21. @ini_set("max_execution_time", "1800");
  22. //兼容php-fpm设置超时
  23. @ini_set("request_terminate_timeout", "1800");
  24. $re['status'] = 0;
  25. $operation = Common::sfilter($_POST['operation']); //前台传入的操作 (normal 正常流程) (afresh 重新下载) (continue 继续下载)
  26. $pid = intval($_REQUEST['pid']);
  27. if (empty($operation)||!in_array($operation,array('normal','afresh','continue'))) {
  28. $re['msg']='未知操作';
  29. echo $Json->encode($re);
  30. exit;
  31. }
  32. //判读项目是否存在
  33. $project = $Db->query('SELECT * FROM '.$Base->table('worksmain').' w LEFT JOIN '.$Base->table('pano_config').' p ON w.pk_works_main = p.pk_works_main WHERE w.pk_works_main = '.$pid.' AND w.pk_user_main = '.$user['pk_user_main'],'Row');
  34. if(empty($project)){
  35. $re['msg'] = '项目不存在';
  36. }else{
  37. //取得下载任务
  38. $task = $Db->query('SELECT id,folder,step,status,msg FROM '.$Base->table('project_download').' WHERE pid='.$pid.' AND uid = '.$user['pk_user_main'],'Row');
  39. if(empty($task)){
  40. $re['msg'] = '任务不存在';
  41. }else if ($task['status']==2) {
  42. $re['msg'] = '打包完成';
  43. $re['status'] = 2;
  44. $re['folder'] = $task['folder'];
  45. }else{
  46. $step = $task['step'];
  47. if ($step == 0||$operation=='normal') {
  48. $step++;
  49. }else if($operation=='afresh'){
  50. if (!empty($task['folder']))
  51. FileUtil::unlinkDir(ROOT_PATH.'temp/down/'.$task['folder'].'/');
  52. $step = 1;
  53. }
  54. $task['step'] = $step;
  55. $funs = getDownloadStep($step);
  56. if ($funs['fun']=='success') {
  57. //下载成功
  58. $re['msg'] = '打包完成';
  59. $re['status'] = 2;
  60. $re['folder'] = $task['folder'];
  61. $task['status']=2;
  62. $task['msg'] = $funs['msg'];
  63. }else{
  64. //继续下载
  65. $project = Transaction::decode_str2arr($project);
  66. if (empty($project['scene_group']['sceneGroups'])) {
  67. //查询图片 imagesmain
  68. $scenes = $Db->query("SELECT i.view_uuid AS viewuuid , i.filename AS sceneTitle ,i.thumb_path AS imgPath FROM ".$Base->table('imgsmain')."i LEFT JOIN ".$Base->table('imgs_works')." iw ON i.pk_img_main = iw.pk_img_main WHERE iw.pk_works_main =".$pid);
  69. $project['scene_group']['sceneGroups'][0]['groupName'] = '场景选择';
  70. $project['scene_group']['sceneGroups'][0]['scenes'] = $scenes;
  71. }
  72. chdir(ROOT_PATH);
  73. //执行打包程序
  74. if ($step==1) {
  75. $p = new ProjectDownload($task['folder'],$project);
  76. $task['folder'] = $p->$funs['fun']();
  77. }else{
  78. $p = new ProjectDownload($task['folder']);
  79. $p->$funs['fun']();
  80. }
  81. $p->writePro($funs['fun']);
  82. //获取下一步要执行的操作
  83. $funs = getDownloadStep($step++);
  84. $task['msg'] = $funs['msg'];
  85. $task['status'] = 1;
  86. $re['msg'] = $funs['msg'];
  87. $re['status'] = 1;
  88. $re['step'] = $step;
  89. }
  90. $taskid = $task['id'];
  91. unset($task['id']);
  92. $Db->update($Base->table('project_download'),$task,array('id'=>$taskid));
  93. }
  94. }
  95. echo $Json->encode($re);
  96. exit;
  97. }
  98. //下载压缩包 ##提取到根目录下 download.php
  99. // else if($act=='download'){
  100. // $filename = Common::sfilter($_REQUEST['filename']);
  101. // $task = $Db->query('SELECT id FROM '.$Base->table('project_download').' WHERE uid='.$user['pk_user_main'].' AND folder = '.$filename,'Row');
  102. // if (empty($task)) {
  103. // die('没有该下载任务');
  104. // }
  105. // $filename = $filename.'.zip';
  106. // $url = ROOT_PATH.'temp/down/'.$filename;
  107. // if (!file_exists($url)) {
  108. // die('找不到该文件');
  109. // }
  110. // /* headers */
  111. // header('Cache-control: private');
  112. // header("Content-type:application/x-zip-compressed");
  113. // header('Content-Length: '.filesize($url));
  114. // header('Content-Disposition: filename=中文名称'.$filename);
  115. // flush();
  116. // $fh = @fopen($url, 'r');
  117. // while(!feof($fh)){
  118. // print fread($fh, 1024);
  119. // flush();
  120. // }
  121. // @fclose($fh);
  122. // unlink($url);
  123. // $Db->delete($Base->table('project_download'),array('id'=>$task['id']));
  124. // exit;
  125. // }
  126. //校验是否在离线下载列表中
  127. else if($act == 'validate'){
  128. $pid = intval($_POST['pid']);
  129. $re['status'] = 0 ;
  130. $project = $Db->query('SELECT name,thumb_path FROM '.$Base->table('worksmain').' w WHERE w.pk_works_main = '.$pid.' AND pk_user_main ='.$user['pk_user_main'],'Row');
  131. if (empty($project)) {
  132. $re['msg'] = '未查询到该项目';
  133. }else{
  134. if($Db->getCount($Base->table('project_download'),'id',array('pid'=>$pid,'uid'=>$user['pk_user_main']))==0){
  135. //写入等待执行到数据库
  136. $Db->insert($Base->table('project_download'),array('pid'=>$pid,'uid'=>$user['pk_user_main'],'pname'=>$project['name'],'thumb'=>$project['thumb_path'],'msg'=>'正在创建目录结构'));
  137. $re['status'] = 1;
  138. }else{
  139. //已经下载列表
  140. $re['msg'] = '您的项目已经在下载列表中,请到离线下载页继续下载,或者删除任务';
  141. }
  142. }
  143. echo $Json->encode($re);
  144. exit;
  145. }
  146. //删除一个离线任务
  147. else if($act=='delete'){
  148. $tid = intval($_REQUEST['tid']);
  149. $re['status'] = 0;
  150. $task = $Db->query('SELECT * FROM '.$Base->table('project_download').' WHERE id = '.$tid.' AND uid = '.$user['pk_user_main'],'Row');
  151. if (empty($task)) {
  152. $re['msg'] = '离线任务不存在';
  153. }else{
  154. $Db->delete($Base->table('project_download'),array('id'=>$tid,'uid'=>$user['pk_user_main']));
  155. if (!empty($task['folder'])) {
  156. $temp = ROOT_PATH.'temp/down/'.$task['folder'];
  157. FileUtil::unlinkDir($temp);
  158. FileUtil::unlinkFile($temp.'.zip');
  159. }
  160. $re['status'] = 1;
  161. }
  162. echo $Json->encode($re);
  163. exit;
  164. }
  165. //跳转到查看页面
  166. else{
  167. //如果传入pid ,则判断pid是否已经在下载列表中
  168. $tp->assign('taskList',$Db->query('SELECT * FROM '.$Base->table('project_download').' WHERE uid='.$user['pk_user_main'].' ORDER BY id DESC'));
  169. }
  170. function getDownloadStep($step){
  171. $funs = array(
  172. //0=>array(),
  173. 1=>array('fun'=>'buildStructure','msg'=>'正在生成目录结构'),
  174. //2=>array('fun'=>'buildHotspot','msg'=>'正在生成热点内容'),
  175. 2=>array('fun'=>'buildTourXml','msg'=>'正在创建xml文件'),
  176. 3=>array('fun'=>'buildHScene','msg'=>'正在生成场景跳转热点'),
  177. 4=>array('fun'=>'buildHLink','msg'=>'正在生成链接热点'),
  178. 5=>array('fun'=>'buildHImage','msg'=>'正在生成图片热点'),
  179. 6=>array('fun'=>'buildHText','msg'=>'正在生成文本热点'),
  180. 7=>array('fun'=>'buildHVoice','msg'=>'正在生成语音热点'),
  181. 8=>array('fun'=>'buildHImgText','msg'=>'正在生成图文热点'),
  182. 9=>array('fun'=>'buildHObj','msg'=>'正在生成环物热点'),
  183. 10=>array('fun'=>'buildHVideo','msg'=>'正在生成视频热点'),
  184. 11=>array('fun'=>'buildOpenAlert','msg'=>'正在生成开场图片'),
  185. 12=>array('fun'=>'buildBgMusic','msg'=>'正在生成背景音乐'),
  186. 13=>array('fun'=>'buildSkyLandShade','msg'=>'正在生成补天补地'),
  187. 14=>array('fun'=>'buildUrlPhoneNvg','msg'=>'正在生成电话链接导航'),
  188. 15=>array('fun'=>'buildSpeechExplain','msg'=>'正在生成语音解说'),
  189. 16=>array('fun'=>'buildEffect','msg'=>'正在生成雨雪特效'),
  190. 17=>array('fun'=>'buildSandTable','msg'=>'正在生成沙盘图'),
  191. 18=>array('fun'=>'buildCustomLogo','msg'=>'正在生成自定义logo'),
  192. 19=>array('fun'=>'buildShare','msg'=>'正在生成分享'),
  193. 20=>array('fun'=>'buildIndexHtml','msg'=>'正在生成首页'),
  194. 21=>array('fun'=>'buildJson','msg'=>'正在序列化json到文件'),
  195. 22=>array('fun'=>'buildZip','msg'=>'正在压缩文件夹'),
  196. 23=>array('fun'=>'success','msg'=>'打包完成'),
  197. );
  198. return $funs[$step];
  199. }
  200. ?>