阿里云智能媒体管理(Intelligent Media Management,简称 IMM),是阿里云提供的针对媒体数据的高级、智能管理服务。它具有与平台无关的 RESTful API 接口,为阿里云上的非结构化存储数据(例如,OSS 中的视频、图片、文档等数据)提供快捷的数据处理通道,比如 OFFICE 格式转换,图片、视频的编辑处理,以及人工智能的价值数据提取和检索(例如,标签识别、人脸分组)。IMM 提供场景化构建的一站式数据应用解决方案,适合媒资管理、智能网盘、社交应用、图库图床等开发者使用。
我们项目的文档都存储在“阿里云的对象存储 OSS”上,为了实现在线浏览文档,将文档转换成图片或其他格式进行预览(我们项目要求转换为PDF格式)。转换为PDF格式的话,直接调用后台方法,返回预览文件路径,进行文档预览
在使用智能媒体服务之前,有以下几个步骤需要操作:
1、注册阿里云账号并完成实名认证
2、登录 阿里云官网
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;
}
网友评论