APP直播源代码实现阿里云OSS分片上传

发布来源:云豹科技
发布人:云豹科技
2022-11-17 09:59:45

随着网络不断快速发展,人们对于获取资源的速度要求越来越高,如果资源获取太慢,应用及企业会损失一大部分客户,在这流量为王的时代,资源存储要求高精快,资源的上传和下载速度也迫在眉睫,下面我们来讲解下APP直播源代码阿里云存储的分片上传。

首先安装云存储sdk,方法有两种:

一:使用composer的方式安装。

在项目的根目录运行composer require aliyuncs/oss-sdk-php,或者在composer.json文件中添加如下依赖关系。

"require": {
    "aliyuncs/oss-sdk-php": "~2.4"
}


运行composer install,安装依赖。

 

二:直接下载安装包,放入项目中,在APP直播源代码需要使用的地方引入。

require_once '/path/to/oss-sdk/autoload.php';
 
下面是分片上传的示例代码:
<? php
if (is_file(__DIR__.
        '/../autoload.php')) {
    require_once __DIR__.
    '/../autoload.php';
}
if (is_file(__DIR__.
        '/../vendor/autoload.php')) {
    require_once __DIR__.
    '/../vendor/autoload.php';
}
 
use OSS\ OssClient;
use OSS\ Core\ OssException;
use OSS\ Core\ OssUtil;
 
// 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录RAM控制台创建RAM账号。
$accessKeyId = "<yourAccessKeyId>";
$accessKeySecret = "<yourAccessKeySecret>";
// Endpoint以杭州为例,其它Region请按实际情况填写。
$endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
$bucket = "<yourBucketName>";
$object = "<yourObjectName>";
$uploadFile = "<yourLocalFile>";
 
/**


 *  步骤1:初始化一个分片上传事件,获取uploadId。

 */
try {
    $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
 
    //返回uploadId。uploadId是分片上传事件的唯一标识,您可以根据uploadId发起相关的操作,如取消分片上传、查询分片上传等。
    $uploadId = $ossClient - > initiateMultipartUpload($bucket, $object);
} catch (OssException $e) {
    printf(__FUNCTION__.
        ": initiateMultipartUpload FAILED\n");
    printf($e - > getMessage().
        "\n");
    return;
}
print(__FUNCTION__.
    ": initiateMultipartUpload OK".
    "\n");
/*


 * 步骤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) {
            printf(__FUNCTION__.
                ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
            printf($e - > getMessage().
                "\n");
            return;
        }
        printf(__FUNCTION__.
            ": initiateMultipartUpload, uploadPart - part#{$i} OK\n");
    }
    // $uploadParts是由每个分片的ETag和分片号(PartNumber)组成的数组。
$uploadParts = array();
foreach($responseUploadPart as $i => $eTag) {
        $uploadParts[] = array(
            'PartNumber' => ($i + 1),
            'ETag' => $eTag,
        );
    }
    /**


     * 步骤3:完成上传。

     */
try {
    // 执行completeMultipartUpload操作时,需要提供所有有效的$uploadParts。OSS收到提交的$uploadParts后,会逐一验证每个分片的有效性。当APP直播源代码所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
    $ossClient - > completeMultipartUpload($bucket, $object, $uploadId, $uploadParts);
} catch (OssException $e) {
    printf(__FUNCTION__.
        ": completeMultipartUpload FAILED\n");
    printf($e - > getMessage().
        "\n");
    return;
}
printf(__FUNCTION__.
": completeMultipartUpload OK\n");

声明:以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任www.yunbaokj.com


声明:
以上内容为云豹科技作者本人原创,未经作者本人同意,禁止转载,否则将追究相关法律责任