阿里云的智能媒体服务(IMM)

2019-04-25  本文已影响0人  Cute_小肥鸡

阿里云智能媒体管理(Intelligent Media Management,简称 IMM),是阿里云提供的针对媒体数据的高级、智能管理服务。它具有与平台无关的 RESTful API 接口,为阿里云上的非结构化存储数据(例如,OSS 中的视频、图片、文档等数据)提供快捷的数据处理通道,比如 OFFICE 格式转换,图片、视频的编辑处理,以及人工智能的价值数据提取和检索(例如,标签识别、人脸分组)。IMM 提供场景化构建的一站式数据应用解决方案,适合媒资管理、智能网盘、社交应用、图库图床等开发者使用。

我们项目的文档都存储在“阿里云的对象存储 OSS”上,为了实现在线浏览文档,将文档转换成图片或其他格式进行预览我们项目要求转换为PDF格式。转换为PDF格式的话,直接调用后台方法,返回预览文件路径,进行文档预览

在使用智能媒体服务之前,有以下几个步骤需要操作:

1、注册阿里云账号并完成实名认证

2、登录 阿里云官网

3、单击 智能媒体管理产品 选择页面中的 立即开通

4、开通服务后,单击 管理控制台 直接进入 智能媒体管理产品 控制台。

相关文档链接地址:https://help.aliyun.com/document_detail/73256.html?spm=a2c4g.11186623.6.660.63bb11a39EaWQN

转换为vector格式时,快速搭建链接地址:https://yq.aliyun.com/articles/589902

后台代码(转换为PDF格式):

/**

    * 调用阿里云的Imm(智能媒体),进行文档预览

    * 将其它格式的文件转换为PDF预览

    * 注意1:如果是PDF直接预览即可,不需要转换

    * 注意2:如果已经存在预览文件,不需要再次调用IMM的接口,避免增加费用

    * @param $where 查询条件

    */

    public function previewDocByPDF($where){

        $tableName = $this ->getTableName();

        $phyFileTable = (new PhysicalFile()) ->getTableName();

        $phyFolderTable = (new PhysicalFolder()) ->getTableName();

        $res = $this ->getDB() ->select("$phyFileTable.FFileType,$phyFileTable.FName,$phyFolderTable.FPath PFolderPath") ->from($tableName)

            ->join($phyFileTable,"$tableName.FPhysicalFileID = $phyFileTable.FID")

            ->join($phyFolderTable,"$phyFolderTable.FID = $phyFileTable.FPhysicalFolderID")

            ->where($where) ->get() ->result_array();

        //物理文件夹名称

        $folderPath = $res[0]["PFolderPath"];

        //物理文件名称

        $fileName = $res[0]["FName"];

        $fileNameEx = explode(".",$fileName);

        //物理文件路径

        $ossObject = $folderPath."/".$fileName;

        //物理文件类型

        $fileType = $res[0]["FFileType"];

        //////判断是否为PDF,是的话,直接返回预览地址;不是的话,调用智能媒体的接口,生成预览文件【如果预览文件夹有预览文件的话,不需要再次调用接口,避免增加费用。】

        //阿里云的一些配置

        $AliyunConfig = new \Config();

        $regionId = $AliyunConfig::OSS_Region_ID;

        $accessKeyId = $AliyunConfig::OSS_ACCESS_ID;

        $accessKeySecret = $AliyunConfig::OSS_ACCESS_KEY;

        $endpoint = $AliyunConfig::OSS_ENDPOINT;

        $bucket = $AliyunConfig::OSS_TEST_BUCKET;

        $ossPreName = $AliyunConfig::OSS_PreviewFolder_Name;

        $previewObject = $ossPreName."/".$fileNameEx[0].".pdf";//预览文件路径

        //判断文件的公开或私有权限

        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

        $ossObjectAcl = $ossClient->getObjectAcl($bucket, $ossObject);

        if($fileType == "pdf"){

            //////////////////////如果是PDF,直接预览

            if($ossObjectAcl == "private" || $ossObjectAcl == "default"){//文件权限为私有,需要URL签名

                $signUrl = $ossClient ->signUrl($bucket,$ossObject,3600);

                if($signUrl){

                    $newres = ["code"=>200,"message"=>"获取成功","data"=>$signUrl];

                }else{

                    $newres = ["code"=>400,"message"=>"获取失败"];

                }

            }else{//文件权限为公开,不需要URL签名

                $filePath = "http://".$bucket.".".$endpoint."/".$ossObject;

                if($res){

                    $newres = ["code"=>200,"message"=>"获取成功","data"=>$filePath];

                }else{

                    $newres = ["code"=>400,"message"=>"获取失败"];

                }

            }

        }else{

            //////////////////////如果不是PDF,需要调用接口

            //1、判断预览文件夹是否存在预览文件

            try{

                $exist = $ossClient->doesObjectExist($bucket, $previewObject);

                if(!$exist){//不存在,需要调用智能媒体的接口,生成预览文件

                    $iClientProfile = \DefaultProfile::getProfile($regionId,$accessKeyId,$accessKeySecret);

                    $client = new \DefaultAcsClient($iClientProfile);

                    // 设置您的项目名称,请确保您已经在控制台创建该项目(IMM的Project名称)

                    $immProjectName = $AliyunConfig::IMM_Project_Name;

                    // 创建文档转换任务

                    $request = new CreateOfficeConversionTaskRequest();

                    $request->setProject($immProjectName);

                    // 设置待转换对文件OSS路径

                    ////路径说明:oss://your-bucket-name/your-path/your-doc.doc(oss://oss的存储空间名称/oss存储空间里面的某文件夹/oss存储空间某文件夹里面的某文件)

                    $OssFilePath = "oss://".$bucket."/".$folderPath."/".$fileName;

                    $request->setSrcUri($OssFilePath);

                    // 设置文件的前缀名称

                    $request->setTgtFilePrefix($fileNameEx[0]);

                    // 设置文件的后缀名称

                    $request->setTgtFileSuffix(".pdf");

                    // 设置文件输出格式

                    $request->setTgtType("pdf");

                    // 设置转换后的输出路径

                    ////路径说明:oss://your-bucket-name/your-path/your-doc-output(oss://oss的存储空间名称/previewDoc预览文件夹(固定))

                    $translatedURL = "oss://".$bucket."/previewDoc/";

                    $request->setTgtUri($translatedURL);

                    $response = $client->getAcsResponse($request);

                    // 获取文档转换任务结果

                    // 由于转换结果非实时给出,需要轮询该接口

                    // 设置最大轮询次数

                    $maxRetryCount = 30;

                    // 设置每次轮询的间隔

                    $retryDelay = 1;

                    $request = new GetOfficeConversionTaskRequest();

                    $request->setTaskId($response->TaskId);

                    $request->setProject($immProjectName);

                    while($maxRetryCount--){

                        sleep($retryDelay);

                        $response = $client->getAcsResponse($request);

                        if($response->Status != 'Running') break;

                    }

                    $previewStatus = $response->Status;

                    if($previewStatus == "Finished"){

                        $previewObjectAcl = $ossClient->getObjectAcl($bucket, $previewObject);

                        if($previewObjectAcl == "private" || $previewObjectAcl == "default"){//文件权限为私有,需要URL签名

                            $signUrl = $ossClient ->signUrl($bucket,$previewObject,3600);

                            $newres = ["code"=>200,"message"=>"获取成功","data"=>$signUrl];

                        }else{

                            $previewFilePath = "http://".$bucket.".".$endpoint."/".$previewObject;

                            $newres = ["code"=>200,"message"=>"获取成功","data"=>$previewFilePath];

                        }

                    }else{

                        $newres = ["code"=>400,"message"=>"获取失败"];

                    }

                }else{////存在,直接返回预览文件路径,不需要调用智能媒体的接口,避免产生费用

                    $previewObjectAcl = $ossClient->getObjectAcl($bucket, $previewObject);

                    if($previewObjectAcl == "private" || $previewObjectAcl == "default"){//文件权限为私有,需要URL签名

                        $signUrl = $ossClient ->signUrl($bucket,$previewObject,3600);

                        $newres = ["code"=>200,"message"=>"获取成功","data"=>$signUrl];

                    }else{

                        $previewFilePath = "http://".$bucket.".".$endpoint."/".$previewObject;

                        $newres = ["code"=>200,"message"=>"获取成功","data"=>$previewFilePath];

                    }

                }

            } catch(OssException $e) {

                $message = $e->getMessage();

                $newres = ["code"=>400,"message"=>$message];

            }

        }

        return $newres;

    }

后台代码(转换为vector格式):

/**

    * 目前不用这种转换,保留

    * 调用阿里云的Imm(智能媒体),进行文档预览

    * 将其它格式的文件转换为Vector预览

    * @param $where 查询条件

    */

    public function previewDocByVector($where){

        $tableName = $this ->getTableName();

        $phyFileTable = (new PhysicalFile()) ->getTableName();

        $phyFolderTable = (new PhysicalFolder()) ->getTableName();

        $res = $this ->getDB() ->select("$phyFileTable.FName,$phyFolderTable.FPath PFolderPath") ->from($tableName)

            ->join($phyFileTable,"$tableName.FPhysicalFileID = $phyFileTable.FID")

            ->join($phyFolderTable,"$phyFolderTable.FID = $phyFileTable.FPhysicalFolderID")

            ->where($where) ->get() ->result_array();

        $folderPath = $res[0]["PFolderPath"];

        $fileName = $res[0]["FName"];

        $fileNameEx = explode(".",$fileName);

        //阿里云

        $AliyunConfig = new \Config();

        $regionId = $AliyunConfig::OSS_Region_ID;

        $accessKeyId = $AliyunConfig::OSS_ACCESS_ID;

        $accessKeySecret = $AliyunConfig::OSS_ACCESS_KEY;

        $endpoint = $AliyunConfig::OSS_ENDPOINT;

        $bucket = $AliyunConfig::OSS_TEST_BUCKET;

        //如果没有生成预览文件的话,生成预览文件

        $iClientProfile = \DefaultProfile::getProfile($regionId,$accessKeyId,$accessKeySecret);

        $client = new \DefaultAcsClient($iClientProfile);

        // 设置您的项目名称,请确保您已经在控制台创建该项目(IMM的Project名称)

        $immProjectName = $AliyunConfig::IMM_Project_Name;

        // 创建文档转换任务

        $request = new CreateOfficeConversionTaskRequest();

        $request->setProject($immProjectName);

        // 设置待转换对文件OSS路径

        ////路径说明:oss://your-bucket-name/your-path/your-doc.doc(oss://oss的存储空间名称/oss存储空间里面的某文件夹/oss存储空间某文件夹里面的某文件)

        $OssFilePath = "oss://".$bucket."/".$folderPath."/".$fileName;

        $request->setSrcUri($OssFilePath);

        // 设置文件输出格式

        $request->setTgtType("vector");

        // 设置转换后的输出路径

        ////路径说明:oss://your-bucket-name/your-path/your-doc-output(oss://oss的存储空间名称/previewDoc预览文件夹(固定)/生成的预览文件夹名称)

        $translatedURL = "oss://".$bucket."/previewDoc/".$fileNameEx[0]."-".$fileNameEx[1]."-output";

        $request->setTgtUri($translatedURL);

        $response = $client->getAcsResponse($request);

        // 获取文档转换任务结果

        // 由于转换结果非实时给出,需要轮询该接口

        // 设置最大轮询次数

        $maxRetryCount = 30;

        // 设置每次轮询的间隔

        $retryDelay = 1;

        $request = new GetOfficeConversionTaskRequest();

        $request->setTaskId($response->TaskId);

        $request->setProject($immProjectName);

        while($maxRetryCount--){

            sleep($retryDelay);

            $response = $client->getAcsResponse($request);

            if($response->Status != 'Running') break;

        }

        //生成的文件格式为vector时,用以下方式获取预览的文件路径【前端用智能媒体的渲染引擎】

        // 预览引擎的访问地址

        $previewUrl = $AliyunConfig::IMM_Preview_Url;

        // 转换结果存放路径

        $previewTgtPath = $AliyunConfig::OSS_PreviewFolder_Name;

        ////////////a、当对象存储OSS为公开时

        $params                    = array();

        $params["url"]            = "https://" . $bucket . "." . $endpoint . "/" .$previewTgtPath ."/" .$fileNameEx[0]."-".$fileNameEx[1]."-output";//必填:转换结果地址,无需在xx-xx-output文件夹后加'/'

        $params["region"]          = "oss-" . $regionId;

        $params["bucket"]          = $bucket;

        //$params["copy"]            = 1;

        ////////////b、当对象存储OSS为私密时

        //$params["accessKeyId"]    = $accessKeyId;//私有读时必填

        //$params["accessKeySecret"] = $accessKeySecret;//私有读时必填

        //$params["stsToken"]        = rawurlencode($securityToken);//私有读时必填

        //$params["region"]          = "oss-" . $regionId;//私有读时必填:OSS 数据所在region

        //$params["bucket"]          = $bucket;//私有读时必填:转换数据所在对象存储 OSS的名称

        //$params["copy"]            = 1;

        $paramsLi = [];

        foreach ($params as $key => $value) {

            $paramsLi[] = $key . "=" . $value;

        }

        $paramsStr = implode("&", $paramsLi);

        $preview = $previewUrl . "?" . $paramsStr;

        return $preview;

    }

上一篇下一篇

猜你喜欢

热点阅读