(在線文庫系統)centos+nginx+mysql+php+openoffice+pdf2swf+pdf2image架構方案php
整體架構:前端
前端web服務器+數據庫服務器+文件轉換服務器+文件存儲服務器mysql
整體描述:linux
前端web頁面上傳文件,後端程序將數據寫入mysql,並將文件發送到文件服務器,文件服務器定時查詢mysql取出須要轉換文件列表,用php腳本調用linux命令執行轉換文件操做,轉換完成後將數據庫對應記錄更新,並將文件發送到文件存儲服務器。nginx
一.將文件發送到文件轉換服務器git
php經過curl發送文件github
搭建一個web服務,只須要2個東東:upload.php、uploads文件夾web
upload.php代碼以下:sql
<?php define('MY_ROOT', str_replace('/upload.php', '', str_replace('\\', '/', __FILE__))); if(isset($_FILES)){ if(isset($_FILES['file'])){ try { move_uploaded_file($_FILES['file']['tmp_name'], MY_ROOT.'/uploads/'.$_FILES['file']['name']); @unlink($GLOBALS[$_FILES['file']['tmp_name']]); echo json_encode(array('success'=>TRUE,'error'=>'')); } catch (Exception $exc) { //echo $exc->getTraceAsString(); echo json_encode(array('success'=>FALSE,'error'=>'移動文件失敗')); } } } ?>
二.文件轉換php腳本核心代碼以下數據庫
#!/usr/local/php.old/bin/php -q <?php date_default_timezone_set('PRC'); error_reporting(E_ALL); /* 取得當前所在的根目錄 */ define('MY_ROOT', str_replace('/setup.php', '', str_replace('\\', '/', __FILE__))); include_once(MY_ROOT."/include/lib_mysql.php");//mysql操做類 require_once(MY_ROOT.'/include/aliyun/aliyun.php'); include_once(MY_ROOT."/config.php"); use \Aliyun\OSS\OSSClient; $client = OSSClient::factory(array( 'AccessKeyId' => $AccessKeyId, 'AccessKeySecret' => $AccessKeySecret, )); $db = new lib_mysql($db_host, $db_user, $db_pass, $db_name); while (true){ $sql = "select aid,softlinks from t_addonbook where wwk=0 "; $list = $db->getAll($sql); //循環處理須要轉換的文檔 foreach($list as $item){ //獲取源文檔的上傳路徑 $local_path = $item['softlinks'];//{dede:link islocal='1' text='本地下載'} /uploads/userup/1088/9-30.xls {/dede:link} $tmp_str = strpos($local_path, '}')+1; $local_path = substr($local_path, $tmp_str);//去除 {dede:link islocal='1' text='本地下載'} $tmp_str = strpos($local_path, '{/dede:link}'); $local_path = substr($local_path, 0, $tmp_str);//去除 {/dede:link} $local_path = str_replace(" ", "", $local_path); $local_file_name = basename($local_path);//文件名+擴展名 $file_name_arr = explode(".", $local_file_name); $file_name = $file_name_arr[0]; $file_type = end($file_name_arr); $file_type = strtolower($file_type); $tmp_name_str = strpos($local_path, $local_file_name); $local_path = substr($local_path, 0,$tmp_name_str);//去除文件名 if(file_exists($upload_path.$local_file_name)){ if(copy($upload_path.$local_file_name, $convert_path.$local_file_name)){//將文件 //將文件轉換爲pdf $start = time(); if($file_type=='txt'){ if(!isUTF8($convert_path.$local_file_name)){//若不是UTF8編碼,則轉碼 $temp = exec("enca -i ".$convert_path.$local_file_name); if(strrpos($temp, '???') === false){//是gbk exec("iconv -f gbk -t utf-8 ".$convert_path.$local_file_name." -o ".$convert_path.$local_file_name);//txt 轉碼 }else{ exec("iconv -f unicode -t utf-8 ".$convert_path.$local_file_name." -o ".$convert_path.$local_file_name);//txt 轉碼 } } } if($file_type!='pdf'){ exec($openoffice_path." -f pdf ".$convert_path.$local_file_name);//轉換爲pdf } //生成縮略圖 exec("cd ".$pdfimg_path); $temp = exec("cd ".$pdfimg_path."&& ./pdf2img -f 1 -w 150 -h 200 ".$convert_path.$file_name.".pdf ".$convert_path.$file_name.".jpg"); //生成swf $temp = exec($swftools_path." -f -T 9 -t ".$convert_path.$file_name.".pdf -o ".$convert_path.$file_name.".swf"); if(strrpos($temp, 'NOTICE') === false){//第一種那個方式轉換失敗 //第二種轉換方式 $temp = exec($swftools_path." -f -T 9 -t -s poly2bitmap ".$convert_path.$file_name.".pdf -o ".$convert_path.$file_name.".swf"); } echo "1->".$item['aid'].' : ';print_r($temp);echo "\n"; //獲取pdf總頁數 $pagenum = getPageTotal($convert_path.$file_name.".pdf"); if(!file_exists($convert_path.$file_name.".jpg")){//jpg exec($mv_path."mv ".$convert_path.$file_name."0001.jpg ".$convert_path.$file_name.".jpg"); } //將swf,jpg和源文件拷貝到文件服務器 /*上傳swf*/ $client->putObject(array( 'Bucket' => 'bucket-wenku', 'Key' => $file_name.'.swf', 'Content' => fopen($convert_path.$file_name.'.swf', 'r'), 'ContentLength' => filesize($convert_path.$file_name.'.swf'), )); /*上傳jpg*/ $client->putObject(array( 'Bucket' => 'bucket-wenku', 'Key' => $file_name.'.jpg', 'Content' => fopen($convert_path.$file_name.'.jpg', 'r'), 'ContentLength' => filesize($convert_path.$file_name.'.jpg'), )); /*上傳源文件*/ $client->putObject(array( 'Bucket' => 'bucket-wenku', 'Key' => $local_file_name, 'Content' => fopen($convert_path.$local_file_name, 'r'), 'ContentLength' => filesize($convert_path.$local_file_name), )); //寫入數據庫 //$onlineviewurl = '/swf/'.$file_name.'.swf'; $onlineviewurl = '/load.php?file='.$file_name.'.swf'; $sql = "update t_addonbook set onlineviewurl='$onlineviewurl',wwk=1,pagenumber=$pagenum where aid=$item[aid]"; $db->query($sql); //$litpic = '/swf/'.$file_name.'.jpg'; $litpic = '/load.php?file='.$file_name.'.jpg'; $sql = "update t_archives set litpic='$litpic' where id=$item[aid]"; $db->query($sql); //刪除文件 exec("rm -rf ".$convert_path.$file_name."*"); //刪除上傳目錄文件 exec("rm -rf ".$upload_path.$local_file_name); }else{ //複製文件失敗 } }else{ //寫入錯誤日誌 } sleep(1); } echo "5\n"; sleep(5); } /** * 獲取PDF的頁數 */ function getPageTotal($path){ // 打開文件 if (!$fp = @fopen($path,"r")) { return false; } else { $max=0; while(!feof($fp)) { $line = fgets($fp,255); if (preg_match('/\/Count [0-9]+/', $line, $matches)){ preg_match('/[0-9]+/',$matches[0], $matches2); if ($max<$matches2[0]) $max=$matches2[0]; } } fclose($fp); // 返回頁數 return $max; } } function isUTF8($str) { $str1 = file_get_contents($str); $code = chkCode($str1); if($code=='UTF-8'){ return TRUE; }else{ return FALSE; } } function chkCode($string){ $code = array('UTF-8','GBK','GB18030','GB2312'); foreach($code as $c){ if( $string === iconv('UTF-8', $c, iconv($c, 'UTF-8', $string))){ return $c; } } return "no"; } ?>
github上面看到也有其餘方法: https://github.com/yoozi/swf-docs-generator