PHP+Laravel5.7 使用阿里OSS+阿里媒体处理上传图片/视频文件

阿里OSS官方后台创建存储空间

第一步:准备工作

登录阿里OSS控制台

  1. 创建OSS存储空间
    登录阿里云控制台
  2. 按步骤创建一个OSS存储空间
    按步骤创建存储空间
  3. 创建媒体处理MPS
    创建媒体处理MPS
  4. 使用composer 执行安装阿里OSS拓展命令:composer require aliyuncs/oss-sdk-php;按下“回车键”等待安装完毕;
    (本人使用的是phpStom编辑器)
    安装阿里oss拓展
  5. 安装阿里媒体处理拓展:composer require obacm/aliyun-openapi-mts;(按下回车键等待安装完毕)
    安装阿里媒体处理拓展
  6. 上传文件到OSS代码(这里使用的是官方php上传SDK)
	//OSS上传控制器
    public function OssUploadFile(Request $request)
    {
        $accessKeyId = "你的accessKeyId ";
        $accessKeySecret = "你的 accessKeySecret ";
        // Endpoint以北京为例,其它Region请按实际情况填写。(‘’http://阿里OSS存储空间概览—>外网访问)
        $endpoint = "http://oss-cn-beijing.aliyuncs.com";
        // 存储空间名称
        $bucket = "你的bucket名称";

        //前端inupt表单的名称
        $file_name_A = 'file_video';
        //laravel 获取上传文件
        $tmpFile_A = $request->file($file_name_A);
        //生成上传OSS后的路径+文件名(注意:路径禁止以"/"开头)
        $object_A = 'aa/'.date("Y_M_D_H_M_S") . '.' . $tmpFile_A->getClientOriginalExtension();
        // 获取临时文件
        $filePath_A = $tmpFile_A->getPath() . '/' . $tmpFile_A->getFilename();
        //OssClient
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        $info_A = $ossClient->uploadFile($bucket, $object_A, $filePath_A);//为了获取上传后的文件信息
        //判断是否上传成功 $info_A['oss-request-url'] :得到上传后的OSS访问地址
        if($info_A['oss-request-url']){
            #上传成功
            var_dump('上传成功');
            die();
        }else{
            #上传失败
            var_dump('上传失败');
            die();
        }
    }

7使用OSS上传+转码功能(上传代码就是上面的第6步);

	//OSS上传控制器
    public function OssUploadFile(Request $request)
    {
        $accessKeyId = "你的accessKeyId ";
        $accessKeySecret = "你的accessKeySecret  ";
        // Endpoint以北京为例,其它Region请按实际情况填写。
        $endpoint = "http://oss-cn-beijing.aliyuncs.com";
        // 存储空间名称
        $bucket = "bingtanghulu";

        //前端inupt表单的名称
        $file_name_A = 'file_video';
        //laravel 获取上传文件
        $tmpFile_A = $request->file($file_name_A);
        //生成上传OSS后的路径+文件名(注意:路径禁止以"/"开头)
        $object_A = 'aa/'.date("Y_M_D_H_M_S") . '.' . $tmpFile_A->getClientOriginalExtension();
        // 获取临时文件
        $filePath_A = $tmpFile_A->getPath() . '/' . $tmpFile_A->getFilename();
        //OssClient
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        $info_A = $ossClient->uploadFile($bucket, $object_A, $filePath_A);//为了获取上传后的文件信息
        //判断是否上传成功
        if($info_A['oss-request-url']){
            #上传成功
            //dd('上传成功');
            #调用转码
            $this->OssMts($object_A);
        }else{
            #上传失败
            dd('上传失败');
        }
    }

    /**
     * 阿里云媒体处理—转码
     * 2019/10/13/22:20
     * @param $oss_input_object_name :OSS中需要转码的文件名,如'Test/input_video001.mp4'
     */
    private function OssMts($oss_input_object_name){
        #转码公共参数配置区域
        $access_key_id = '你的accessKeyId';
        $access_key_secret = '你的access_key_secret ';
        //您需要操作的OSS存储空间的所在地,例如'cn-beijign'表示‘中国北京’
        $mps_region_id = 'cn-beijing';

        $pipeline_id = '你的管道ID';//管道ID(//您的案例媒体处理控制台->全局设置->管道->管道ID)
        $template_id = 'S00000001-200010';//模板ID(官方文档Deom中默认,你自己在媒体处理->全局设置->转码模板中自己创建一个也可以,不会的创建就用官方Demo给的这个,或自行科普)

        $oss_location = 'oss-cn-beijing';//您需要操作的OSS存储空间的所在地就是OSS存储空间概览->外网访问EndPoint(地域节点)的前缀,(我的是北京,所以写'oss-cn-beijing')
        $oss_bucket = '你的bucket名称';//你的Oss存储空间bucket名称


        //待转码文件(前面上传方法成功后,调用转码方法传进来的参数)
        $oss_input_object = $oss_input_object_name;
        //转码完毕后输出的文件名(你也可以自己加路径,例如:‘test/2020-02-11/output.mp4’  Oss存储空间会根据你的就路径自己创建相关文件层级,切记文件路径开头不能使用‘/’或者‘\’开头,这个oss手动创建文件夹时会有提示)
        $oss_output_object = 'output.mp4';

        $clientProfile = DefaultProfile::getProfile(
            $mps_region_id,                   # 您的 Region ID
            $access_key_id,                   # 您的 AccessKey ID
            $access_key_secret                # 您的 AccessKey Secret
        );

		//开始执行转码步骤
        $client = new DefaultAcsClient($clientProfile);
		 # 创建API请求并设置参数
        $request = new SubmitJobsRequest();
        $request->setAcceptFormat('JSON');
        # Input 输入待转码的OSS文件
        $input = [
            'Location' => $oss_location,
            'Bucket' => $oss_bucket,
            'Object' => urlencode($oss_input_object)
        ];
        $request->setInput(json_encode($input));
        # Output 输出转码完毕的OSS文件
        $output = [
            'OutputObject' => urlencode($oss_output_object)
        ];
        # Ouput->Container 转码完毕后的格式
        $output['Container'] = array('Format' => 'mp4');
        # Ouput->Video 输入视频配置
        //本数组中的参数value 根据你的实际需求自己定义
        $output['Video'] = [
            'Codec' =>'H.264',//编码格式
            'Bitrate' => 1500,//比特率/码率
            'Width' => 1280,//视频宽度
            'Fps' => 25//视频每秒帧数
        ];
        # Ouput->Audio 输入音频配置
         //本数组中的参数value 根据你的实际需求自己定义
        $output['Audio'] = [
            'Codec' => 'AAC',//解码器
            'Bitrate' => 128,//比特率
            'Channels' => 2,//频道
            'Samplerate' => 44100//抽样率
        ];
        # Ouput->TemplateId //输入模板化
        $output['TemplateId'] = $template_id;
        $outputs = array($output);
        #设置输出
        $request->setOUtputs(json_encode($outputs));
        #设置输入OSS_Bucket名称
        $request->setOutputBucket($oss_bucket);
        #设置输入OSS_所在地
        $request->setOutputLocation($oss_location);
        # PipelineId 设置转码管道ID
        $request->setPipelineId($pipeline_id);
        # 发起请求并处理返回
        $response = $client->getAcsResponse($request);
        //判断转码是否成功
        if($response->{'JobResultList'}->{'JobResult'}[0]->{'Success'}){
            #转码成功
            //删除未转码的源文件
            //拼接完成转码的文件路径并更新数据库
        }else{
            #转码失败
            'SubmitJobs Failed code:' .
            $response->{'JobResultList'}->{'JobResult'}[0]->{'Code'} .
            ' message:' .
            $response->{'JobResultList'}->{'JobResult'}[0]->{'Message'} . "\n";
        }

        # 发起请求并处理返回,下面这点捕获异常根据你的需求要不要都行,这个就是让你看报错和返回值的。
        try {
            $response = $client->getAcsResponse($request);
            print 'RequestId is:' . $response->{'RequestId'} . "\n";
            //RequestId is:9EF6A44A-7568-407F-B48C-A6A840C83ECE JobId is:5328efd028dc458da5c5fdb9bee7a245 这个是返回值
            if ($response->{'JobResultList'}->{'JobResult'}[0]->{'Success'}) {
                print 'JobId is:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Job'}->{'JobId'} . "\n";
            } else {
                print 'SubmitJobs Failed code:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Code'} .
                    ' message:' .
                    $response->{'JobResultList'}->{'JobResult'}[0]->{'Message'} . "\n";
            }
        } catch(\ServerException $e) {
            print 'Error: ' . $e->getErrorCode() . ' Message: ' . $e->getMessage() . "\n";
        } catch(\ClientException $e) {
            print 'Error: ' . $e->getErrorCode() . ' Message: ' . $e->getMessage() . "\n";
        }

    }

以上就是Laravel 5.7 +php 使用阿里官方上传SDK和conposer下载的阿里媒体处理拓展的详细使用方法。

注意上上述代码中有很多配置项,例如accessKeyId 和accessKeyId 等这些我在演示中没有进行封装,在实际生产中,我会把这些信息封装到config中。在使用laravel辅助函数config(‘key’) 进行调用!

发布了5 篇原创文章 · 获赞 0 · 访问量 413

猜你喜欢

转载自blog.csdn.net/weixin_42701376/article/details/104257171