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

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

    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,240评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,328评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,182评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,121评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,135评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,093评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,013评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,854评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,295评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,513评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,678评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,398评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,989评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,636评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,801评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,657评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,558评论 2 352

推荐阅读更多精彩内容