PHP上传视频到阿里云oss

  • 下载阿里云oss的SDK

composer require aliyuncs/oss-sdk-php

  • 上传视频,我用的是分片上传,其实阿里云的文档已经写得很清楚了,不过这是当我把上传的功能写出来后才这样觉得的,在没有写出来的时候我当时觉得他的文档写的一点都不清楚,所以我才决定写篇文章记录下
  • 下面的代码是复制阿里文档的,本文主要是解释说明下其中的几个参数 :
    • $accessKeyId,$accessKeySecret这两个值都是可以在阿里云的账号中获取到的
    • $endpoint是oss仓库中的 Endpoint地域节点中的外网访问的那个,也可以是传输加速域名的那个
    • $bucket 是oss的仓库名称
    • $object是指在上传到阿里云oss后文件的路径(其中包含了路径+文件名称)
    • $filePath是指在前端上传文件到后端后,有一个临时存放的位置,一般的键名是tmp_name
use OSS\Core\OssException;
use OSS\Core\OssUtil;
use OSS\OssClient;

protected function uploadVideoToOss($accessKeyId, $accessKeySecret, $endpoint, $bucket, $object, $filePath)
{
    try {
        $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        //返回uploadId。uploadId是分片上传事件的唯一标识,您可以根据uploadId发起相关的操作,如取消分片上传、查询分片上传等。
        $uploadId = $ossClient->initiateMultipartUpload($bucket, $object);
    } catch (OssException $e) {
        return error_code(0, $e->getMessage());
    }

    $partSize = 10 * 1024 * 1024;
    $uploadFileSize = filesize($filePath);
    $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 => $filePath,
            // 设置分片号。
            $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($filePath, $fromPos, $toPos);
            $upOptions[$ossClient::OSS_CONTENT_MD5] = $contentMd5;
        }
        try {
            // 上传分片。
            $responseUploadPart[] = $ossClient->uploadPart($bucket, $object, $uploadId, $upOptions);
        } catch (OssException $e) {
            return error_code(0, $e->getMessage());
        }
    }
    $uploadParts = array();
    foreach ($responseUploadPart as $i => $eTag) {
        $uploadParts[] = array(
            'PartNumber' => ($i + 1),
            'ETag' => $eTag,
        );
    }

    try {
        $result = $ossClient->completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
        return $result;
    } catch (OssException $e) {
        return error_code(0, $e->getMessage());
    }
}

  • 有一些需要注意的地方:
    • 在上传比较大的文件的时候,此时可能需要修改php.ini文件中的一些值,我试过了在代码中使用ini_set()来设置,但是好像不起作用
    • 有些值网上说是使用ini_set()修改不起作用,可以在.htaccess文件中修改,但是我试过了直接报错,也不知道是我的原因还是什么
    • 因此我就直接修改了php.ini文件中的值,比如有 :
    • upload_max_filesize,post_max_size,max_execution_time,max_input_time,memory_limit

你可能感兴趣的:(PHP,PHP上传文件到阿里云oss)