laravel8.6 实现阿里云图片上传+视频分片上传

263 阅读2分钟

目录

  • 十大云存储服务商
    1. 登陆阿里云官网,开通对象存储服务 OSS
    1. 创建存储空间
    1. 绑定自定义域名
    1. 配置阿里云CDN加速
    1. 到此为止,项目中对接阿里云对象存储OSS所需参数都有了

十大云存储服务商


www.hostucan.cn/cloud-stora…

1. 登陆阿里云官网,开通对象存储服务 OSS


三种方式都可以找到阿里云对象存储

第一次使用阿里云对象存储需要先开通该服务

2. 创建存储空间


3. 绑定自定义域名


这里会自动添加 CNAME 记录,不需要自己去解析域名,此时就可以使用自定义的域名访问文件了

此时需要等待几分钟,域名解析需要时间

4. 配置阿里云CDN加速


点击 未配置 会跳转到添加CDN域名页面

资源分组:选择为默认资源组,其他选项使用默认的即可

选择资源分组,点击下面的 下一步

提示前往解析CNAME,点击 返回域名列表

复制 CDN 域名的 CNAME

修改解析的CDN域名的CNAME记录值,将刚才复制的CNAME粘贴上去

等待几分钟,配置成功,点击右侧的域名绑定配置

图片上传接口

public function uploadFile(Request $request)
{
    //获取图片/视频临时路径
    $file = $request->file('file');
    //获取后缀名
    $suffix = $file->getClientOriginalName();
    $files = substr(strrchr($suffix, '.'), 1);
    //判断是图片还是视频
    if($files=='mp4'){
        //阿里云oss 分片上传
        $video = OssServe::videos($file);
        return ['code'=>200,'msg'=>'ok','data'=>$video];
    }else{
        //阿里云oss 图片上传
        $res = OssServe::alyImg($file);
        return ['code'=>200,'msg'=>'ok','data'=>$res];
    }
}

服务层

//阿里云文件存储
public static function alyImg($filePath)
{
    $accessKeyId = "";
    $accessKeySecret = "";
    // Endpoint以上海为例,其它Region请按实际情况填写。
    $endpoint = "http://oss-cn-shanghai.aliyuncs.com";
    // 设置存储空间名称。
    $bucket = "";
    $object = date("Y-m-d") . '/' . time() . rand(1, 999999) . '.png';
    try {
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

        $path = $ossClient->uploadFile($bucket, $object, $filePath);
    } catch (OssException $e) {
        printf(__FUNCTION__ . ": FAILED\n");
        printf($e->getMessage() . "\n");
    }
    return $path['info']['url'];
}

//视频分片上传
public static function videos($path)
{
    $accessKeyId = "";
    $accessKeySecret = "";
    // Endpoint以上海为例,其它Region请按实际情况填写。
    $endpoint = "http://oss-cn-shanghai.aliyuncs.com";
    $bucket = "";
    $object = date("Y-m-d") . '/' . time() . rand(1, 999999) . '.mp4';
    $uploadFile = $path;

    /**
     *  步骤1:初始化一个分片上传事件,获取uploadId。
     */
    try {
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);

        //返回uploadId。uploadId是分片上传事件的唯一标识,您可以根据uploadId发起相关的操作,如取消分片上传、查询分片上传等。
        $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
    } catch (OssException $e) {

    }
    /*
     * 步骤2:上传分片。
     */
    $partSize = 10 * 1024 * 1024;
    $uploadFileSize = filesize($uploadFile);
    $pieces = $ossClient->generateMultiuploadParts($uploadFileSize, $partSize);
    $responseUploadPart = array();
    $uploadPosition = 0;
    $isCheckMd5 = true;
    foreach ($pieces as $i => $piece) {
        $fromPos = $uploadPosition + (integer)$piece[$ossClient::OSS_SEEK_TO];
        $toPos = (integer)$piece[$ossClient::OSS_LENGTH] + $fromPos - 1;
        $upOptions = array(
            // 上传文件。
            $ossClient::OSS_FILE_UPLOAD => $uploadFile,
            // 设置分片号。
            $ossClient::OSS_PART_NUM => ($i + 1),
            // 指定分片上传起始位置。
            $ossClient::OSS_SEEK_TO => $fromPos,
            // 指定文件长度。
            $ossClient::OSS_LENGTH => $toPos - $fromPos + 1,
            // 是否开启MD5校验,true为开启。
            $ossClient::OSS_CHECK_MD5 => $isCheckMd5,
        );
        // 开启MD5校验。
        if ($isCheckMd5) {
            $contentMd5 = OssUtil::getMd5SumForFile($uploadFile, $fromPos, $toPos);
            $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
        }
        try {
            // 上传分片。
            $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
        } catch (OssException $e) {

        }

    }
    // $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。
    $uploadParts = array();
    foreach ($responseUploadPart as $i => $eTag) {
        $uploadParts[] = array(
            'PartNumber' => ($i + 1),
            'ETag' => $eTag,
        );
    }
    /**
     * 步骤3:完成上传。
     */
    try {
        // 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
        $pathVideo = $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
    } catch (OssException $e) {

    }
    return 'cdn回源域名'.$object;
}