logFile = Yii::getAlias('@runtime').DIRECTORY_SEPARATOR.'logs'.DIRECTORY_SEPARATOR.'cmdtransfer_'.date("Ymd").'.log'; $this->transferDir = UPLOAD_PATH.'transfer'.DIRECTORY_SEPARATOR; $this->transferUrl = UPLOAD_URL.'transfer/'; $ossConfigResult = Yii::$app->db->createCommand("select * from {{%config}} where name='oss'")->queryOne(); $this->ossConfig = string2array($ossConfigResult['value']); $transferConfigResult = Yii::$app->db->createCommand("select * from {{%config}} where name='transfer'")->queryOne(); $this->transferConfig = string2array($transferConfigResult['value']); $attachmentConfigResult = Yii::$app->db->createCommand("select * from {{%config}} where name='attachment'")->queryOne(); $this->attachmentConfig = string2array($attachmentConfigResult['value']); $imgConfigResult = Yii::$app->db->createCommand("select * from {{%config}} where name='imageconfig'")->queryOne(); $this->imgConfig = string2array($imgConfigResult['value']); if($this->ossConfig['OPEN_OSS']) { $this->oss = new \app\common\components\Oss(); $initResult = $this->oss->init($this->ossConfig['OPEN_INTERNAL']); if($initResult['error']) { exit("OSS初始化出错"); } } } public function actionIndex() { $doc = Yii::$app->db->createCommand("select * from {{%doc}} where (trans_status=0 or trans_status=99) and is_delete=0 order by id desc limit 1")->queryOne(); if(!empty($doc)) { if($doc['trans_status']==99&&TIMESTAMP-$doc['transfer_start_time']>=$this->transferConfig['timeout']) { Yii::$app->db->createCommand("update {{%doc}} set trans_status=88 where id=".$doc['id'])->execute(); $this->_saveLog('timeout',$doc); } else { //只对待转换文档处理 if($doc['trans_status']==0)$this->_dotrans($doc['id']); } } } //执行转换 private function _dotrans($id) { set_time_limit(0); $status = 5;//默认进入待自审状态 $audit_bak = [];//审核备注 $doc = Yii::$app->db->createCommand("select * from (select * from {{%doc}} where id=$id) a left join {{%doc_data}} b on a.id=b.id")->queryOne(); $this->_saveLog('start',$doc); //获取用户组权限 if($doc['user_id']) { $user = Yii::$app->db->createCommand("select * from {{%user}} where user_id=".$doc['user_id']."")->queryOne(); if(!empty($user)) { $userGroupLevel = Yii::$app->db->createCommand("select * from {{%user_group_level}} where id=".$user['user_group_level'])->queryOne(); if($userGroupLevel) { $levelSettings = string2array($userGroupLevel['settings']); //免自审 if($levelSettings['doc_auto_selfaudit']==1) { $status = 0; } //免审核,直接发布 if($levelSettings['doc_auto_audit']==1) { $status = 1; } } } } //合辑,资源免转换 if(in_array($doc['doc_type'],[2,3,4])) { Yii::$app->db->createCommand("update {{%doc}} set trans_status=1,transfer_end_time=".time().",status=$status where id=$id")->execute(); $this->_saveLog('end',$doc); } else { $downResult = $this->_locateFile(getFileUrl($doc['file']),$doc['ext']); if($downResult['error']==0) { $transferFolder = $downResult['data'][0]; $transferFile = $downResult['data'][1]; $relativeFolder = $downResult['data'][2]; $relativeFile = $downResult['data'][3]; Yii::$app->db->createCommand("update {{%doc}} set trans_status=99,transfer_start_time=".time()." where id=$id")->execute(); //图片 if(in_array($doc['ext'],array('jpg','jpeg','gif','png','bmp'))){ $imgResult = $this->_doimg($transferFolder,$transferFile); $imgcode = $imgResult['data']['imgcode']; Yii::$app->db->createCommand("update {{%doc}} set trans_status=1,transfer_end_time=".time().",status=$status,page_num = 1,preview_num=1,thumb='".$doc['file']."' where id=".$id)->execute(); Yii::$app->db->createCommand("update {{%doc_data}} set imgcode='".json_encode($imgcode)."' where id=".$id)->execute(); //封面图信息 if(!empty($doc['file'])) { Yii::$app->db->createCommand("insert into {{%attachment}} set status=1,file_path='".$doc['file']."',hash='".md5($doc['file'])."',is_used=1,upload_time=".time().",file_name='".basename($doc['file'])."'")->execute(); Yii::$app->db->createCommand("insert into {{%attachment_index}} set table_name='doc',field='thumb',data_id=".$id.",a_id=".Yii::$app->db->getLastInsertID()."")->execute(); } $result = array('error'=>0,'msg'=>'处理成功'); } else if(in_array($doc['ext'],array('zip','rar'))) { $packfiles = $this->_uncompress($transferFile,$id); if(!empty($packfiles)&&is_array($packfiles)) { Yii::$app->db->createCommand("update {{%doc_data}} set packfiles = '".addslashes(array2string($packfiles))."' where id=".$id)->execute(); Yii::$app->db->createCommand("update {{%doc}} set trans_status=1,transfer_end_time=".time().",status=$status where id=".$id)->execute(); $result = array('error'=>0,'msg'=>'处理成功'); } else { $result = array('error'=>1,'msg'=>'解压失败'); $audit_bak[] = "解压失败"; } } else if(in_array($doc['ext'],array('mp3','mp4','flv','wmv'))) { $mediaResult = $this->_domedia($transferFolder,$transferFile); if($mediaResult['error']==0) { Yii::$app->db->createCommand("update {{%doc}} set trans_status=1,transfer_end_time=".time().", status=$status, page_num = ".$mediaResult['data']['page_num'].", preview_num=".$mediaResult['data']['preview_num']." where id=".$id)->execute(); Yii::$app->db->createCommand("update {{%doc_data}} set h5code='".json_encode($mediaResult['data']['h5code'])."' where id=".$id)->execute(); $result = array('error'=>0,'msg'=>'处理成功'); } else { $result = array('error'=>1,'msg'=>'音视频处理失败'); $audit_bak[] = "音视频处理失败"; } } else if(in_array(strtolower($doc['ext']),array('ppt','pptx','dps'))&&$this->transferConfig['trans_type']=='localkiivo'&&$this->transferConfig['pptimg'])//使用知沃云ppt转图片 { $pptResult = $this->_doppt($transferFolder,$transferFile,getFileUrl($doc['file'])); if($pptResult['error']==0) { $page_num = $pptResult['data']['page_num']; $imgcode = $pptResult['data']['imgcode']; $preview_num = $pptResult['data']['preview_num']; if(empty($doc['thumb'])){ Yii::$app->db->createCommand("update {{%doc}} set page_num = $page_num,preview_num=$preview_num, thumb='".$imgcode[0]."', trans_status=1,transfer_end_time=".time().", status=$status where id=".$id)->execute(); } else { Yii::$app->db->createCommand("update {{%doc}} set page_num = $page_num,preview_num=$preview_num, trans_status=1,transfer_end_time=".time().", status=$status where id=".$id)->execute(); } Yii::$app->db->createCommand("update {{%doc_data}} set imgcode='".json_encode($imgcode)."' where id=".$id)->execute(); //封面图信息 if(!empty($imgcode[0])&&empty($doc['thumb'])) { Yii::$app->db->createCommand("insert into {{%attachment}} set status=1,file_path='".$imgcode[0]."',hash='".md5($imgcode[0])."',is_used=1,upload_time=".time().",file_name='".basename($imgcode[0])."'")->execute(); Yii::$app->db->createCommand("insert into {{%attachment_index}} set table_name='doc',field='thumb',data_id=".$id.",a_id=".Yii::$app->db->getLastInsertID()."")->execute(); } $result = array('error'=>0,'msg'=>'处理成功'); } else { $result = $pptResult; } } else { //只有在本地转换或本地+知沃云转换时候,需要转成PDF if($this->transferConfig['trans_type']=='local'||$this->transferConfig['trans_type']=='localkiivo') { if(in_array(strtolower($doc['ext']),array('pdf'))) { $pdfFile = $transferFile; } else { $pdfFile = $this->_toPdf($transferFolder,$transferFile); } } else//云转换 { $pdfFile = $transferFile; } if($pdfFile) { if($this->transferConfig['trans_type']=='local'||$this->transferConfig['trans_type']=='localkiivo') { //如果设定为转成图片 if($this->transferConfig['dist_type']=='img') { $pdfPageInfo = $this->_pdfPageInfo($pdfFile); $page_num = $pdfPageInfo['data']['pageNum']; $h5code = []; $fullcontent = ''; $content = ''; //重新计算预览页数 $transferPage = $pdfPageInfo['data']['transferPage']; $preview_num = $this->_getPreviewNum($page_num,$transferPage); $imgResult = $this->_pdf2img($pdfFile,$transferPage); } else if($this->transferConfig['dist_type']=='h5') { $pdf2htmlResult = $this->_pdf2html($pdfFile); if($pdf2htmlResult['error']==0) { $page_num = $pdf2htmlResult['data']['pageNum']; $h5code = $pdf2htmlResult['data']['h5code']; $preview_num = $pdf2htmlResult['data']['preview_num']; $fullcontent = $pdf2htmlResult['data']['fullcontent']; $content = beforeProcessHtml($pdf2htmlResult['data']['content']); $imgResult = $this->_pdf2img($pdfFile); } else { //转换html失败,尝试转图片 $page_num = $pdf2htmlResult['data']['pageNum']; $h5code = []; $fullcontent = ''; $content = ''; //重新计算预览页数 $transferPage = $pdf2htmlResult['data']['transferPage']; $preview_num = $this->_getPreviewNum($page_num,$transferPage); $imgResult = $this->_pdf2img($pdfFile,$transferPage); } } else if($this->transferConfig['dist_type']=='all') { $pdf2htmlResult = $this->_pdf2html($pdfFile); if($pdf2htmlResult['error']==0) { $page_num = $pdf2htmlResult['data']['pageNum']; $h5code = $pdf2htmlResult['data']['h5code']; $preview_num = $pdf2htmlResult['data']['preview_num']; $fullcontent = $pdf2htmlResult['data']['fullcontent']; $content = beforeProcessHtml($pdf2htmlResult['data']['content']); $transferPage = $pdf2htmlResult['data']['transferPage']; $imgResult = $this->_pdf2img($pdfFile,$transferPage); } else { //转换html失败,尝试转图片 $page_num = $pdf2htmlResult['data']['pageNum']; $h5code = []; $fullcontent = ''; $content = ''; //重新计算预览页数 $transferPage = $pdf2htmlResult['data']['transferPage']; $preview_num = $this->_getPreviewNum($page_num,$transferPage); $imgResult = $this->_pdf2img($pdfFile,$transferPage); } } } else { //云转换 $imgResult = $this->_doRemoteTrans($pdfFile); $page_num = $imgResult['data']['pageNum']; $h5code = []; $fullcontent = ''; $content = ''; $transferPage = $imgResult['data']['transferPage']; $preview_num = $this->_getPreviewNum($page_num,$transferPage); } if($imgResult['error']==0) { //生成封面 $imgcode = $imgResult['data']['imgcode']; //页数超限 if($page_num>50) { $status = 6; $audit_bak[] = '页数超限(超过50页需重点审核)'; } //pdf二审 if($doc['ext']=='pdf'){ $status = 7; $audit_bak[] = 'PDF需要二审'; } if(!empty($fullcontent)) { //敏感词检测 $sesResult = sensitive($fullcontent); if(!empty($sesResult)) { if($sesResult['log2']) { $status = 8;//非法资源 $audit_bak[] = $sesResult['log2']; } if($sesResult['log1']) { $status = 8;//非法资源 $audit_bak[] = $sesResult['log1']; } if($sesResult['log3']) { $status = 8;//非法资源 $audit_bak[] = $sesResult['log3']; } } } if(empty($doc['thumb'])) { Yii::$app->db->createCommand("update {{%doc}} set page_num = $page_num,preview_num=$preview_num, thumb='".$imgcode[0]."', trans_status=1,transfer_end_time=".time().", status=$status where id=".$id)->execute(); } else { Yii::$app->db->createCommand("update {{%doc}} set page_num = $page_num,preview_num=$preview_num, trans_status=1,transfer_end_time=".time().", status=$status where id=".$id)->execute(); } Yii::$app->db->createCommand("update {{%doc_data}} set h5code='".json_encode($h5code)."',imgcode='".json_encode($imgcode)."',content='".addslashes($content)."' where id=".$id)->execute(); //封面图信息 if(!empty($imgcode[0])&&empty($doc['thumb'])) { Yii::$app->db->createCommand("insert into {{%attachment}} set status=1,file_path='".$imgcode[0]."',hash='".md5($imgcode[0])."',is_used=1,upload_time=".time().",file_name='".basename($imgcode[0])."'")->execute(); Yii::$app->db->createCommand("insert into {{%attachment_index}} set table_name='doc',field='thumb',data_id=".$id.",a_id=".Yii::$app->db->getLastInsertID()."")->execute(); } $result = array('error'=>0,'msg'=>'处理成功'); } else { $result = $imgResult; } } else { $result = array('error'=>1,'msg'=>'文件转化成PDF失败'); } } } else { $result = array('error'=>1,'msg'=>'文件下载到本地失败'); } } //标记失败状态 if($result['error']==1) { Yii::$app->db->createCommand("update {{%doc}} set trans_status=88 where id=$id")->execute(); } else { //转换日志 Yii::$app->db->createCommand("delete from {{%doc_auditlog}} where doc_id=$id")->execute(); if(is_array($audit_bak))foreach($audit_bak as $abak) { Yii::$app->db->createCommand("insert into {{%doc_auditlog}} set doc_id=$id,log='".$abak."',create_time=".time()."")->execute(); } $this->_saveLog('end',$doc); //免审核,直接上架 if($levelSettings['doc_auto_audit']==1&&$status==1) { //此处写上架代码 $this->_autoAudit($id); } } } //转化成pdf private function _toPdf($transferFolder,$transferFile) { $baseFile = basename($transferFile); $pdfFile = str_replace(".".fileext($baseFile),".pdf",$baseFile); $targetFile = $transferFolder.$pdfFile; //云转换 if($this->transferConfig['trans_type']=='localkiivo'&&in_array(fileext($transferFile),['doc','docx','wps','ppt','pptx','dps'])) { $fileUrl = $this->transferUrl.str_replace(DIRECTORY_SEPARATOR,'/',str_replace($this->transferDir,'',$transferFile)); $data = ['file'=>$fileUrl,'appkey'=>$this->transferConfig['cloudpwd'],'action'=>'topdf']; $options['time_out'] = 300; $result = https_request($this->transferConfig['cloudurl'],$options,$data); $result = json_decode($result,true); $pdf = $result['data']['pdf']; if(!empty($pdf)&&file_put_contents($targetFile,file_get_contents($pdf))){ return $targetFile; } else { return false; } } else { $command = "cd $transferFolder&&/opt/libreoffice7.1/program/soffice --headless --invisible --convert-to pdf $baseFile"; if(!empty($command)) { //file_put_contents($this->logFile,$command."\r\n",FILE_APPEND); passthru($command,$return); if(file_exists($targetFile)&&$return==0) { return $targetFile; } else { return false; } } else { return false; } } } //将pdf转化成h5 private function _pdf2html($pdf) { $workPath = $this->_initWorkPath($pdf); $pageNum = $this->_getPdfPageNum($pdf); $pdfcontent = ''; if($pageNum>=1) { if($this->transferConfig['fullpage']) { $transferPage = $pageNum; } else { if($this->transferConfig['transferpage_type']=='page') { $transferPage = $this->transferConfig['transferpage']; } else { $transferPagePercent = (float)$this->transferConfig['transferpage']/100; $transferPage = ceil($transferPagePercent*$pageNum); } } if($this->transferConfig['transfermaxpage']>0&&$transferPage>$this->transferConfig['transfermaxpage']) { $transferPage = $this->transferConfig['transfermaxpage']; } if($transferPage>$pageNum)$transferPage = $pageNum; if($transferPage==0)$transferPage = 1; $toHtmlCmd = "pdf2htmlEX -l $transferPage --split-pages 1 --dest-dir ".$workPath." --css-filename pdf.css --embed-css 0 --fit-width 800 --optimize-text 1 --process-outline 0 --use-cropbox 0 --page-filename page%d.html ".$pdf; //file_put_contents($this->logFile,$toHtmlCmd."\r\n",FILE_APPEND); passthru($toHtmlCmd,$return); if($return==0) { @unlink($workPath.'base.min.css'); @unlink($workPath.'fancy.min.css'); $h5code = []; $allFileList = []; $allFileList[] = $workPath.'pdf.css'; for($i=1;$i<=$transferPage;$i++) { $allFileList[] = $workPath.'page'.$i.'.html'; //如果页数太多,只取10页内容 if($pageNum>10&&$i<=10) { $pdfcontent .= strip_tags(file_get_contents($workPath.'page'.$i.'.html')); } } if(is_array($allFileList))foreach ($allFileList as $unitFile) { if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $h5code[] = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $h5code[] = $result['data']['path']; } } else { return [ 'error' => 1, 'msg' => $result['msg'] ]; } } else { $relativeFile = str_replace($this->transferDir,'',$unitFile); $targetFile = UPLOAD_PATH.$relativeFile; dir_create(dirname($targetFile)); if(copy($unitFile,$targetFile)) { if($this->attachmentConfig['absolute_url']) { $h5code[] = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } else { $h5code[] = str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } } else { return [ 'error' => 1, 'msg' => '复制失败' ]; } } } //获取文字内容 if($this->transferConfig['gettext']) { //如果页数少,直接用插件读取内容 if($pageNum<=10) { $parser = new Parser(); $pdfParer = $parser->parseFile($pdf); $pdfcontent = $pdfParer->getText(); } $fullcontent = $pdfcontent; if(!empty($pdfcontent)&&$this->transferConfig['textlength']>0) { $pdfcontent = str_cut($pdfcontent,0,$this->transferConfig['textlength'],''); } } else { $pdfcontent = ''; } if($this->transferConfig['previewfullpage']) { $preview_num = $pageNum; } else { if($this->transferConfig['previewmaxpage_type']=='page') { $preview_num = $this->transferConfig['previewmaxpage']; } else { $previewPagePercent = (float)$this->transferConfig['previewmaxpage']/100; $preview_num = ceil($previewPagePercent*$pageNum); } } if($preview_num>$pageNum)$preview_num = $pageNum; if($preview_num==0)$preview_num = 1; if($this->transferConfig['transfermaxpage']>0&&$preview_num>$this->transferConfig['transfermaxpage']){ $preview_num = $this->transferConfig['transfermaxpage']; } if($preview_num>$transferPage)$preview_num = $transferPage; return [ 'error' => 0, 'msg' => '处理成功', 'data'=>['h5code'=>$h5code,'pageNum'=>$pageNum,'transferPage'=>$transferPage,'preview_num'=>$preview_num,'fullcontent'=>$fullcontent,'content'=>$pdfcontent] ]; } else { return [ 'error' => 1, 'msg' => '转化html失败' ]; } } else { return [ 'error' => 1, 'msg' => '文档页数异常' ]; } } //将PDF转换成图片 private function _pdf2img($pdf,$transferPage=0) { $result = []; if(!extension_loaded('imagick')) { $result = array('error'=>1,'msg'=>'imagick加载失败'); } if(!file_exists($pdf)) { $result = array('error'=>1,'msg'=>'pdf不存在'); } if(!is_readable($pdf)) { $result = array('error'=>1,'msg'=>'pdf不可读'); } if(empty($result)) { $workPath = $this->_initWorkPath($pdf);//dirname($pdf).DIRECTORY_SEPARATOR.md5(basename($pdf)).DIRECTORY_SEPARATOR; dir_create($workPath); $imgcode = []; $im = new \Imagick(); $im->setResolution(300, 300); $im->setCompressionQuality(100); //$page = 0;//只读取首页 //$im->readImage($pdf."[".$page."]"); if($transferPage==0) { $page = 0;//只读取首页 $im->readImage($pdf."[".$page."]"); } else { $im->readImage($pdf); } foreach ($im as $key => $var) { if($transferPage>0&&($key+1)>$transferPage)continue; $var->setImageFormat('png'); $unitFile = $workPath.$key.'.png'; if(@$var->writeImage($unitFile) == true) { //打水印 if($this->attachmentConfig['open_watermark']&&!empty($this->imgConfig['watermark'])) { $watermark = $this->_locateWatermark(); set_img_water($unitFile,$watermark,$this->attachmentConfig['watermark_quality'],$this->attachmentConfig['watermark_pos']); } if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $imgcode[] = $result['data']['path']; } } else { return [ 'error' => 1, 'msg' => $result['msg'] ]; } } else { $targetFile = str_replace($this->transferDir,'',$unitFile); dir_create(dirname(UPLOAD_PATH.$targetFile)); if(copy($unitFile,UPLOAD_PATH.$targetFile)) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$targetFile); } else { $imgcode[] = str_replace(DIRECTORY_SEPARATOR,'/',$targetFile); } } else { return [ 'error' => 1, 'msg' => '复制图片失败' ]; } } } else { return array('error'=>1,'msg'=>'PDF转图片失败'); } } $im->destroy(); return array('error'=>0,'msg'=>'PDF转图片成功','data'=>['imgcode'=>$imgcode]); } else { return $result; } } //获取预览页数 private function _getPreviewNum($pageNum,$transferPage) { if($this->transferConfig['previewfullpage']) { $preview_num = $pageNum; } else { if($this->transferConfig['previewmaxpage_type']=='page') { $preview_num = $this->transferConfig['previewmaxpage']; } else { $previewPagePercent = (float)$this->transferConfig['previewmaxpage']/100; $preview_num = ceil($previewPagePercent*$pageNum); } } if($preview_num>$pageNum)$preview_num = $pageNum; if($preview_num==0)$preview_num = 1; if($this->transferConfig['transfermaxpage']>0&&$preview_num>$this->transferConfig['transfermaxpage']){ $preview_num = $this->transferConfig['transfermaxpage']; } if($preview_num>$transferPage)$preview_num = $transferPage; return $preview_num; } private function _getPdfPageNum($file) { if(!file_exists($file)) { return $this->_getPdfPageNum($file); } else { exec(sprintf('gs -q -dNODISPLAY -c "(%s) (r) file runpdfbegin pdfpagecount = quit"', $file), $res, $ret); if(0 == $ret) { return (int) $res[0]; } return 0; } } //获取PDF总页数和转换页数 private function _pdfPageInfo($pdf) { $pageNum = $this->_getPdfPageNum($pdf); if($pageNum>=1) { if($this->transferConfig['fullpage']) { $transferPage = $pageNum; } else { if($this->transferConfig['transferpage_type']=='page') { $transferPage = $this->transferConfig['transferpage']; } else { $transferPagePercent = (float)$this->transferConfig['transferpage']/100; $transferPage = ceil($transferPagePercent*$pageNum); } } if($this->transferConfig['transfermaxpage']>0&&$transferPage>$this->transferConfig['transfermaxpage']) { $transferPage = $this->transferConfig['transfermaxpage']; } if($transferPage>$pageNum)$transferPage = $pageNum; if($transferPage==0)$transferPage = 1; return [ 'error' => 0, 'msg' => '获取pdf页数成功', 'data'=>['pageNum'=>$pageNum,'transferPage'=>$transferPage] ]; } else { return [ 'error' => 1, 'msg' => '文档页数异常' ]; } } //PPT云转换 private function _doppt($transferFolder,$transferFile) { $ext = fileext($transferFile); $workPath = $this->_initWorkPath($transferFile); $fileUrl = $this->transferUrl.str_replace(DIRECTORY_SEPARATOR,'/',str_replace($this->transferDir,'',$transferFile)); $data = ['file'=>$fileUrl,'appkey'=>$this->transferConfig['cloudpwd'],'action'=>'ppt2img']; $options['time_out'] = 300; $pptresult = https_request($this->transferConfig['cloudurl'],$options,$data); $pptresult = json_decode($pptresult,true); if($pptresult['error']==0) { $images = $pptresult['data']['imgs']; $imgcode = []; if(is_array($images))foreach($images as $image) { $imgfile = $workPath.basename($image); if(file_put_contents($imgfile,file_get_contents($image))) { $unitFile = $imgfile; //打水印 if($this->attachmentConfig['open_watermark']&&!empty($this->imgConfig['watermark'])) { $watermark = $this->_locateWatermark(); set_img_water($unitFile,$watermark,$this->attachmentConfig['watermark_quality'],$this->attachmentConfig['watermark_pos']); } if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $imgcode[] = $result['data']['path']; } } else { return [ 'error' => 1, 'msg' => $result['msg'] ]; } } else { $relativeFile = str_replace($this->transferDir,'',$unitFile); $targetFile = UPLOAD_PATH.$relativeFile; dir_create(dirname($targetFile)); if(copy($unitFile,$targetFile)) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } else { $imgcode[] = str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } } else { return [ 'error' => 1, 'msg' => 'PPT单元页上传失败' ]; } } } } $page_num = count($imgcode); if($this->transferConfig['previewfullpage']) { $preview_num = $page_num; } else { if($this->transferConfig['previewmaxpage_type']=='page') { $preview_num = $this->transferConfig['previewmaxpage']; } else { $previewPagePercent = (float)$this->transferConfig['previewmaxpage']/100; $preview_num = ceil($previewPagePercent*$page_num); } } //预览页数不应该迟超过转换页数上线 if($this->transferConfig['transfermaxpage']>0&&$preview_num>$this->transferConfig['transfermaxpage']){ $preview_num = $this->transferConfig['transfermaxpage']; } if($preview_num>$page_num)$preview_num = $page_num; if($preview_num==0)$preview_num = 1; return [ 'error' => 0, 'msg' => '处理成功', 'data'=>['imgcode'=>$imgcode,'page_num'=>$page_num,'preview_num'=>$preview_num] ]; } else { return array('error'=>1,'msg'=>'PPT远程处理失败'); } } private function _domedia($transferFolder,$transferFile) { $ext = fileext($transferFile); $workPath = $this->_initWorkPath($transferFile); $videoInfo = $this->_getVideoInfo($transferFile); //预览和截断时间(秒) if($videoInfo['all_time']<=30) { $preview_num = 30; } else { if($this->transferConfig['previewfullmedia']) { $preview_num = $videoInfo['all_time']; } else { if($this->transferConfig['mediatime_type']=='seconds') { $preview_num = $this->transferConfig['mediatime']; } else { $previewMediaPercent = (float)$this->transferConfig['mediatime']/100; $preview_num = ceil($previewMediaPercent*$videoInfo['all_time']); } } } if($preview_num>$videoInfo['all_time'])$preview_num = $videoInfo['all_time']; $cuttedFile = $workPath.md5(basename($transferFile)).'_'.$preview_num.'.'.$ext; $cuttedDir = dirname($cuttedFile); $cutto = $this->changeTimeType($preview_num); dir_create($cuttedDir); $cutVideoCmd = "/usr/bin/ffmpeg -i $transferFile -vcodec copy -acodec copy -ss 00:00:00 -to $cutto $cuttedFile -y"; passthru($cutVideoCmd,$return); if($return==0) { $unitFile = $cuttedFile; $h5code = []; if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $h5code[] = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $h5code[] = $result['data']['path']; } } else { return [ 'error' => 1, 'msg' => $result['msg'] ]; } } else { $relativeFile = str_replace($this->transferDir,'',$unitFile); $targetFile = UPLOAD_PATH.$relativeFile; dir_create(dirname($targetFile)); if(copy($unitFile,$targetFile)) { if($this->attachmentConfig['absolute_url']) { $h5code[] = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } else { $h5code[] = str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } } else { return [ 'error' => 1, 'msg' => '音视频文件上传失败' ]; } } return [ 'error' => 0, 'msg' => '处理成功', 'data'=>['h5code'=>$h5code,'page_num'=>$videoInfo['all_time'],'preview_num'=>$preview_num] ]; } else { return array('error'=>1,'msg'=>'音视频裁剪失败'); } } //获取文档总页数和转换页数 private function _doRemoteTrans($file) { $workPath = $this->_initWorkPath($file);//dirname($pdf).DIRECTORY_SEPARATOR.md5(basename($pdf)).DIRECTORY_SEPARATOR; dir_create($workPath); $imgcode = []; if($this->transferConfig['OSS_ACCESS_KEY']) { //腾讯云 $object = str_replace($this->transferDir,'',$file); $protocol = str_replace("://","",SITE_PROTOCOL); $ossClient = new \Qcloud\Cos\Client( array( 'region' => $this->transferConfig['OSS_REGION'], 'schema' => $protocol, //协议头部,默认为http 'credentials'=> array( 'secretId' => $this->transferConfig['OSS_ACCESS_KEY'] , 'secretKey' => $this->transferConfig['OSS_ACCESS_SECRET']))); $fileContent = fopen($file, "rb"); if ($fileContent) { $ossresult = $ossClient->putObject(array( 'Bucket' => $this->transferConfig['OSS_BUCKET'], 'Key' => $object, 'Body' => $fileContent)); //远程文件地址 $remoteFileUrl = SITE_PROTOCOL.$ossresult['Location']; } $pageInfo = $this->_getRemoteFilePage($remoteFileUrl); if($remoteFileUrl) { for($i=1;$i<=$pageInfo['data']['transferPage'];$i++) { $tempUrl = $remoteFileUrl.'?ci-process=doc-preview&page='.$i; $requestData = https_request($tempUrl); //写图片到平台存储 $unitFile = $workPath.$i.'.jpg'; if(file_put_contents($unitFile,$requestData)) { //打水印 if($this->attachmentConfig['open_watermark']&&!empty($this->imgConfig['watermark'])) { $watermark = $this->_locateWatermark(); set_img_water($unitFile,$watermark,$this->attachmentConfig['watermark_quality'],$this->attachmentConfig['watermark_pos']); } if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $imgcode[] = $result['data']['path']; } } else { return [ 'error' => 1, 'msg' => $result['msg'] ]; } } else { $targetFile = str_replace($this->transferDir,'',$unitFile); dir_create(dirname(UPLOAD_PATH.$targetFile)); if(copy($unitFile,UPLOAD_PATH.$targetFile)) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$targetFile); } else { $imgcode[] = str_replace(DIRECTORY_SEPARATOR,'/',$targetFile); } } else { return [ 'error' => 1, 'msg' => '复制图片失败' ]; } } } } //删除转换容器中的文件 $ossClient->deleteObject(array( 'Bucket' => $this->transferConfig['OSS_BUCKET'], //存储桶名称 'Key' => $object )); return [ 'error' => 0, 'msg' => '远程转换成功', 'data'=>['pageNum'=>$pageInfo['data']['pageNum'],'transferPage'=>$pageInfo['data']['transferPage'],'imgcode'=>$imgcode] ]; } else { return array('error'=>1,'msg'=>'上传到对象存储失败'); } } else { return array('error'=>1,'msg'=>'远程转换配置错误'); } } //获取远程文件总页数 private function _getRemoteFilePage($remoteFileUrl) { $max_page = 1000; for($i=1;$i<=$max_page;$i++) { $tempUrl = $remoteFileUrl.'?ci-process=doc-preview&page='.$i; $requestData = https_request($tempUrl); if($this->iss_xml($requestData)) { //格式化XML libxml_disable_entity_loader(true); $requestObj = simplexml_load_string($requestData, 'SimpleXMLElement', LIBXML_NOCDATA); if($requestObj->Code=='NoSuchPage') { $pageNum = ($i-1); if($this->transferConfig['fullpage']) { $transferPage = $pageNum; } else { if($this->transferConfig['transferpage_type']=='page') { $transferPage = $this->transferConfig['transferpage']; } else { $transferPagePercent = (float)$this->transferConfig['transferpage']/100; $transferPage = ceil($transferPagePercent*$pageNum); } } if($this->transferConfig['transfermaxpage']>0&&$transferPage>$this->transferConfig['transfermaxpage']) { $transferPage = $this->transferConfig['transfermaxpage']; } if($transferPage>$pageNum)$transferPage = $pageNum; if($transferPage==0)$transferPage = 1; return [ 'error' => 0, 'msg' => '获取页数成功', 'data'=>['pageNum'=>$pageNum,'transferPage'=>$transferPage] ]; } } } } //判断是否是XML function iss_xml($content){ //判断返回的内容是不是 xml 格式 $xml_parser = xml_parser_create(); $res = xml_parse($xml_parser, $content, true); xml_parser_free($xml_parser); return $res; } //获取文件信息 private function _getVideoInfo($file) { $command = " ffmpeg -i $file 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"; ob_start(); passthru($command); $info = ob_get_contents(); ob_end_clean(); $data = array(); $duration = explode(":",$info); $duration_in_seconds = $duration[0]*3600 + $duration[1]*60+ round($duration[2]);//转化为秒 $data['all_time'] = $duration_in_seconds; $data['size'] = filesize($file); //文件大小 return $data; } function changeTimeType($seconds) { if ($seconds > 3600) { $hours = intval($seconds / 3600); $time = $hours . ":" . gmstrftime('%M:%S', $seconds); } else { $time = gmstrftime('%H:%M:%S', $seconds); } return $time; } //解压缩压缩包文件 private function _uncompress($transferFile,$id) { $ext = fileext($transferFile); $workPath = $this->_initWorkPath($transferFile); if($ext=='zip') { $z = new Unzip(); $z->unzip($transferFile,$workPath, true, true); } else if($ext=='rar') { $rar_file = rar_open($transferFile) or die("Failed to open Rar archive"); $entries = rar_list($rar_file); foreach ($entries as $entry) { $entry->extract($workPath); } rar_close($rar_file); } $filelist = $this->scanDir($workPath,$this->transferDir); if($this->transferConfig['previewpack']) { $this->initPackFile($filelist,$id); } return $filelist; } //初始化压缩包待转换数据 function initPackFile($arr,$id) { $packexts = $this->transferConfig['packexts']?explode("|",$this->transferConfig['packexts']):['ppt','pptx','doc','docx','xls','xlsx','pdf','jpeg','jpg','png','gif','bmp','txt']; Yii::$app->db->createCommand("delete from {{%doc_packfile}} where doc_id=$id")->execute(); if(is_array($arr))foreach($arr as $key=>$val) { if(is_array($arr[$key])) { $this->initPackFile($arr[$key],$id); } else { if(!in_array(fileext($arr[$key]),$packexts))continue; $unitFile = $this->transferDir.$arr[$key]; if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $realPath = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $realPath = $result['data']['path']; } } } else { $relativeFile = str_replace($this->transferDir,'',$unitFile); $targetFile = UPLOAD_PATH.$relativeFile; $targetPath = dirname($targetFile); dir_create($targetPath); if(copy($unitFile,$targetFile)) { if($this->attachmentConfig['absolute_url']) { $realPath = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } else { $realPath = str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } } } if(!empty($realPath)) { $ext = fileext($arr[$key]); Yii::$app->db->createCommand("insert into {{%doc_packfile}} set doc_id=$id,name='".addslashes(basename($arr[$key],'.'.$ext))."',ext='".$ext."',path='".addslashes($arr[$key])."',path_md5='".md5($arr[$key])."',realpath='".addslashes($realPath)."'")->execute(); } } } } //获取压缩包目录树(全路径) function scanDir($pathName,$transferDir) { //将结果保存在result变量中 $result = array(); $temp = array(); //判断传入的变量是否是目录 if(!is_dir($pathName) || !is_readable($pathName)) { return null; } $pathName = rtrim($pathName,'/'); //取出目录中的文件和子目录名,使用scandir函数 $allFiles = scandir($pathName); //遍历他们 foreach($allFiles as $fileName) { //判断是否是.和..因为这两个东西神马也不是。。。 if(in_array($fileName, array('.', '..'))) { continue; } //路径加文件名 $fullName = $pathName.'/'.$fileName; //如果是目录的话就继续遍历这个目录 if(is_dir($fullName)) { //将这个目录中的文件信息存入到数组中 $result[$fullName] = $this->scanDir($fullName,$transferDir); }else { //如果是文件就先存入临时变量 $temp[] = $fullName; } } //取出文件 if($temp) { foreach($temp as $f) { $result[] = $f; } } $result = string2array(str_replace($transferDir,'',array2string($result))); return $result; } //处理图片 private function _doimg($transferFolder,$transferFile) { $workPath = $this->_initWorkPath($transferFile); $newname = time(); $unitFile = $workPath.$newname.'.'.fileext($transferFile); copy($transferFile,$unitFile); //$resize = new \app\common\components\ResizeImage($transferFile, 2000, 2000,$newname, 0,0,$workPath); //$unitFile = $resize->dstimg; //打水印 if($this->attachmentConfig['open_watermark']&&!empty($this->imgConfig['watermark'])) { $watermark = $this->_locateWatermark(); set_img_water($unitFile,$watermark,$this->attachmentConfig['watermark_quality'],$this->attachmentConfig['watermark_pos']); } if($this->ossConfig['OPEN_OSS']) { $result = $this->oss->Upload($unitFile,str_replace($this->transferDir,'',$unitFile)); if($result['error']==0) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = str_replace($this->ossConfig['OSS_INTERNAL_ENDPOINT'],$this->ossConfig['OSS_ENDPOINT'],$result['data']['url']); } else { $imgcode[] = $result['data']['path']; } } else { return [ 'error' => 1, 'msg' => $result['msg'] ]; } } else { $relativeFile = str_replace($this->transferDir,'',$unitFile); $targetFile = UPLOAD_PATH.$relativeFile; $targetPath = dirname(UPLOAD_PATH.$relativeFile); dir_create($targetPath); if(copy($unitFile,$targetFile)) { if($this->attachmentConfig['absolute_url']) { $imgcode[] = UPLOAD_URL.str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } else { $imgcode[] = str_replace(DIRECTORY_SEPARATOR,'/',$relativeFile); } } else { return [ 'error' => 1, 'msg' => '转换图片失败' ]; } } return array('error'=>0,'msg'=>'图片转换成功','data'=>['imgcode'=>$imgcode]); } //本地化水印图片 private function _locateWatermark() { $watermarkPath = UPLOAD_PATH.'watermark'.DIRECTORY_SEPARATOR; dir_create($watermarkPath); $watermark = $watermarkPath.basename($this->imgConfig['watermark']); //本地存储水印 if(!file_exists($watermark)) { file_put_contents($watermark,file_get_contents(getFileUrl($this->imgConfig['watermark']))); } return $watermark; } //根据临时转换文件路径,生成目标子目录 private function _initWorkPath($transferFile) { $ext = fileext($transferFile); $basename = basename($transferFile,'.'.$ext); $workPath = dirname($transferFile).DIRECTORY_SEPARATOR.md5($basename).DIRECTORY_SEPARATOR; dir_create($workPath); return $workPath; } //下载文件到转码目录 private function _locateFile($file,$ext) { if(!check_remote_file_exists($file))return array('error'=>1,'msg'=>'文件不存在'); $result = parse_url($file); $result['path'] = str_replace('/upload/','',$result['path']); $relativeFile = ltrim(str_replace('/',DIRECTORY_SEPARATOR,$result['path']),DIRECTORY_SEPARATOR); $relativeFolder = dirname($relativeFile).DIRECTORY_SEPARATOR; $transferFile = $this->transferDir.$relativeFile; $transferFolder = dirname($transferFile).DIRECTORY_SEPARATOR; dir_create($transferFolder); if(file_exists($transferFile)) { return array('error'=>0,'msg'=>'下载成功','data'=>[$transferFolder,$transferFile,$relativeFolder,$relativeFile]); } if($this->ossConfig['OPEN_OSS']) { $downresult = $this->oss->downLoad($transferFile,$relativeFile); if($downresult['error']==0) { return array('error'=>0,'msg'=>'下载成功','data'=>[$transferFolder,$transferFile,$relativeFolder,$relativeFile]); } else { return array('error'=>1,'msg'=>$downresult['msg']); } } else { if(is_net_file($file)) { file_put_contents($transferFile,file_get_contents($file)); } else { file_put_contents($transferFile,file_get_contents(UPLOAD_URL.ltrim($result['path'],'/'))); } return array('error'=>0,'msg'=>'下载成功','data'=>[$transferFolder,$transferFile,$relativeFolder,$relativeFile]); } } //写日志 private function _saveLog($title,$doc) { file_put_contents($this->logFile,$doc['title']."(".$title."-".get_date(time(),'Y-m-d H:i:s').")\r\n",FILE_APPEND); } //自动上架 private function _autoAudit($id) { $doc = Yii::$app->db->createCommand("select * from {{%doc}} where id=".$id)->queryOne(); $docData = Yii::$app->db->createCommand("select * from {{%doc_data}} where id=".$id)->queryOne(); //把表从草稿表复制到正式表 $docFields = []; if(is_array($doc))foreach($doc as $k=>$v) { if($k=='id'||$k=='status')continue; if($k=='description') { //文档摘要处理 if((empty($doc['description'])||$doc['title']==$doc['description'])&&!empty($docData['content'])) { $length = $this->transferConfig['desclength']>0?$this->transferConfig['desclength']:'350'; $description = str_cut(removeHtml($docData['content'],0),0,$length); } else { $description = $doc['description']; } $docFields[] = "description ='".$description."'"; } else { $docFields[] = "$k ='".$v."'"; } } $docFields[] = "status=1"; $result = Yii::$app->db->createCommand("insert into {{%doc_real}} set ".join(",",$docFields))->execute(); $newId = getLastInsertId(); if($result) { $docDataFields= []; if(is_array($docData))foreach($docData as $k=>$v) { if($k=='id'||$k=='hash')continue; if($k=='file'&&$doc['doc_type']==1) { $hash = randString(8); $docDataFields[] = "hash='".$hash."'"; $docDataFields[] = "file='".sys_auth($docData['file'],'ENCODE',$hash)."'"; } else { $docDataFields[] = "$k ='".$v."'"; } } $docDataFields[] = "id='".$newId."'"; if($doc['doc_type']==1&&!in_array($doc['ext'],['rar','zip','mp3','mp4']))$docDataFields[] = "content=''"; $result1 = Yii::$app->db->createCommand("insert into {{%doc_real_data}} set ".join(",",$docDataFields))->execute(); if($result1) { //更新附件关联信息,将草稿表的记录改成正式表 $sql = "update {{%attachment_index}} set data_id=$newId,table_name='doc_real' where table_name='doc' and field='thumb' and data_id=$id"; Yii::$app->db->createCommand($sql)->execute(); $sql = "update {{%attachment_index}} set data_id=$newId,table_name='doc_real_data' where table_name='doc_data' and field='file' and data_id=$id"; Yii::$app->db->createCommand($sql)->execute(); //更新tag标签.将草稿表的记录改成正式表 $sql = "update {{%tag_data}} set data_id=$newId,table_name='doc_real' where table_name='doc' and data_id=$id"; Yii::$app->db->createCommand($sql)->execute(); //更新审核记录表 $sql = "update {{%doc_auditlog}} set doc_real_id=$newId where doc_id=$id"; Yii::$app->db->createCommand($sql)->execute(); //更新压缩包细节目录 $sql = "update {{%doc_packfile}} set doc_real_id=$newId where doc_id=$id"; Yii::$app->db->createCommand($sql)->execute(); //更新合辑 if($doc['doc_type']==2) { $sql = "update {{%doc_col}} set col_id=$newId where col_id=$id"; Yii::$app->db->createCommand($sql)->execute(); } $sql = "delete from {{%doc}} where id=$id"; $dResult = Yii::$app->db->createCommand($sql)->execute(); $sql = "delete from {{%doc_data}} where id=$id"; $dResult1 = Yii::$app->db->createCommand($sql)->execute(); //把草稿删除 if(!$dResult||!$dResult1) { return ['error' => 1,'msg' => '操作失败']; } else { return ['error' => 0,'msg' => '操作成功']; } } else { return ['error' => 1,'msg' => '操作失败']; } } else { return ['error' => 1,'msg' => '操作失败']; } } }