美文网首页
阿里云的智能媒体服务(IMM)

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

作者: Cute_小肥鸡 | 来源:发表于2019-04-25 10:30 被阅读0次

    阿里云智能媒体管理(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;

        }

    相关文章

      网友评论

          本文标题:阿里云的智能媒体服务(IMM)

          本文链接:https://www.haomeiwen.com/subject/wecagqtx.html