convertFile($uploadlist);
        2. 异步调用 -多文件上传需调用多次,支持执行时间检测和转换状态更新
            $url = $this->config['site_url'].'Api/FlashPaper/convertFile';
            foreach($uploadList as $data){
                post($url,$data);
            }
    * 注意
       1. 多文件同时转换
          - FlashPaper产生多个独立的进程,转换完毕后自动关闭经常和被调用的程序(尚未支持)
       2. 使用pptx/docx/xlsx转换速度快于2003格式
    * 保持转换信息
        - 系统默认保存转换的文件名称,文件大小,文件类型,转换后保持地址,转换时间,转换运行时间和转换失败的错误信息
        - 默认保存的数据库表是log_swfread 保存的方式是execSaveInfo
        3. 程序中使用的框架为THINKPHP
*/
class FlashPaperAction extends Action
{
    public $flashpaper_url = '/Public/FlashPaper/FlashPrinter.exe'; // 应用程序路径
    public $allow_file_ext = 'doc|docx|ppt|pptx|xls|xlsx|pdf|jpg|bmp|gif|png|txt'; // 允许转换的文件格式(可打印的文件)
    public $swf_savepath = '/Data/swfscorce/'; // SWF保存虚拟路径
    public $time_limit = 1000; // 程序最大运行时间
    private $socket = false; // 是否socket请求
    private $scorce_file_path; // 上传文件物理路径
    private $scorce_save_path; // 上传文件的保存路径
    private $score_file_name; // 上传文件保存名称
    private $scorce_file_ext; // 上传文件扩展名
    private $scorce_file_size; // 文件大小
    private $exec_error; // 转换文件错误提示
    private $exec_start_time; // 转换开始时间
    private $exec_end_time; // 转换结束时间
    private $scorce_attch_id; // 附件信息ID号
    private $swf_file_path = ''; // 转换swf文件保存物理路径
    public function test(){
        // 测试各种格式的文件转换
        // 支持的文件: txt pdf ppt pptx jpg gif png bmp xls
        // 正在测试的文件: docx,xlsx,rtf pps pot doc
        $command = 'D:/yjoa/Public/FlashPaper/FlashPrinter.exe -o D:/yjoa/Data/swfScorce/201110/1.docx.swf D:/yjoa/Data/flashpaper/201110/1.xlsx';
        $command = str_replace("/","\\",$command);
        $exec_start_time = $this->exectime();
        exec($command, $return_array);
        $exec_end_time = $this->exectime();
        echo 'Execue Time:'.round($exec_end_time - $exec_start_time, 6).'
'; echo $command; } // 转换DEMO页面 public function _empty() { $fconfig = F('Config'); $upload_allow_ext = ''; $upload_allow_desc = ''; $upload_allow_extsarr = explode(',', $fconfig['upload_allow_exts']); foreach ($upload_allow_extsarr as $v) { $upload_allow_ext = $upload_allow_ext. '*'.$v.';'; $upload_allow_desc = $upload_allow_desc. '.'.$v.','; } $upload_allow_ext = substr($upload_allow_ext, 0, -1); $upload_allow_desc = substr($upload_allow_desc, 0, -1); $this->assign('upload_allow_desc', $upload_allow_desc); $this->assign('upload_allow_ext', $upload_allow_ext); $this->display('read'); } /* 初始化 */ public function _initialize() { ignore_user_abort(true); set_time_limit($this->time_limit); // FLASHPAPER转换程序物理地址 $this->flashpaper_url = $_SERVER['DOCUMENT_ROOT'].$this->flashpaper_url; // 自动创建转换保存目录 @mkdir('.'.$this->swf_savepath); @mkdir('.'.$this->swf_savepath.date('Ym')); // SWF文件保存虚拟路径 $this->swf_file_path = $this->swf_savepath.date('Ym'); // SWF文件保存物理路径 $this->swf_savepath = $_SERVER['DOCUMENT_ROOT'].$this->swf_savepath.date('Ym').'/'; } /* 调用FlashPaper,$uploadlist是ThinkPHP的UPLOAD上传的数组形式的文件数组信息 */ public function convertFile($uploadList) { if (!$uploadList){ $uploadList = array( 0 => $_POST); $this->socket = true; } if(is_array($uploadList)) { foreach ($uploadList as $v) { $this->scorce_file_path = $_SERVER['DOCUMENT_ROOT'].substr($v['savepath'],1).$v['savename']; $this->score_file_name = strrpos($v['savename'], '.') ? substr($v['savename'],0,strrpos($v['savename'], '.')) : $v['savename']; $this->scorce_file_ext = $v['extension']; $this->scorce_file_size = $v['size']; $this->scorce_attch_id = $v['attid'] ? $v['attid'] : 0; $this->scorce_save_path = substr($v['savepath'],1).$v['savename']; $this->execFile(); } } } // 检测是否满足条件转换 private function check() { $err = 0; $this->exec_error = ''; $err_tip = array( 1 => 'FlashPaper只能运行与Windows环境下', 2 => 'FlashPrinter.exe转换文件不存在', 3 => '没有exec函数执行权限', 4 => 'FlashPrinter('.$this->flashpaper_url.')目录不可读', 5 => '上传文件('.$this->scorce_file_path.')不存在', 6 => '保存('.$this->swf_savepath.')目录不存在或不可写', 7 => '不支持该文件格式('.$this->scorce_file_ext.')的转换', ); // 是否WINDOWS环境 if(!IS_WIN){ $err = 1; } // 检测FlashPaper是否存在 else if (!file_exists($this->flashpaper_url)){ $err = 2; } // 检测exec是否可以执行 else if (!function_exists('exec')){ $err = 3; } // FlashPaper是否可读 else if (!is_readable($this->flashpaper_url)){ $err = 4; } // 源文件是否可读 else if (!is_readable($this->scorce_file_path)){ $err = 5; } // 保存目录是否可写 else if (is_dir($this->swf_file_path)){ $err = 6; } // 检测文件格式 else if (!in_array($this->scorce_file_ext, explode('|', $this->allow_file_ext))){ $err = 7; } if ($err){ $this->exec_error = $err_tip[$err]; return false; } return true; } // 转换上传文件 private function execFile() { if ($this->check()) { $swf_path = $this->swf_savepath.$this->score_file_name.'.swf '; // SWF文件相对路径 $this->swf_file_path = $this->swf_file_path.'/'.$this->score_file_name.'.swf'; // 转换SWF命令 $command = $this->flashpaper_url.' -o '.$swf_path.$this->scorce_file_path; $command = str_replace("/","\\",$command); // 纪录转换时间 $this->exec_start_time = $this->exectime(); // 调用FlashPaper执行转换 exec($command); $this->exec_end_time = $this->exectime(); } // 保存执行信息 $this->execSaveInfo(); } // 记录转换运行数据 private function execSaveInfo() { $state = 0; // 转换状态,默认未转换 $time = time(); $runtime = round($this->exec_end_time - $this->exec_start_time, 6); $scorcepath = $this->scorce_file_path; $swfread = M('swfread'); if ($this->exec_error == '') { $sql = "INSERT INTO `log_swfread` (attid,filename,filesize,filetype,`time`,runtime,`state`,filepath,scorcepath) VALUES ('{$this->scorce_attch_id}', '".$this->score_file_name.'.'.$this->scorce_file_ext."', '{$this->scorce_file_size}', '{$this->scorce_file_ext}', '{$time}', '{$runtime}', '{$state}', '{$this->swf_file_path}', '{$this->scorce_save_path}' );"; } else { // 转换失败 $sql = "INSERT INTO `log_swfread` (attid,filename,filesize,filetype,`time`,runtime,`state`,filepath,scorcepath,`error`) VALUES ('{$this->scorce_attch_id}', '".$this->score_file_name.'.'.$this->scorce_file_ext."', '{$this->scorce_file_size}', '{$this->scorce_file_ext}', '{$time}', '{$runtime}', '0', '{$this->swf_file_path}', '{$this->scorce_save_path}', '{$this->exec_error}' );"; } $swfread->execute($sql); $swfid = $swfread->query("SELECT MAX(swfid) as id FROM `log_swfread`"); // socket模式:请求监听生成状态和执行时间 if ($this->socket && $this->exec_error == ''){ $i = 1; while(true){ if (file_exists('.'.$this->swf_file_path)){ $this->exec_end_time = $this->exectime(); $runtime = round($this->exec_end_time - $this->exec_start_time, 6); $sql = "UPDATE log_swfread SET `state` = 1 , runtime = '{$runtime}' WHERE swfid = '{$swfid[0]['id']}'"; $swfread->query($sql); break; } if (++$i > $this->time_limit-100) break; sleep(1); } } } // 执行时间 private function exectime() { $time = explode(" ", microtime()); $usec = (double)$time[0]; $sec = (double)$time[1]; return $sec + $usec; } } ?>