- 下载阿里云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
- 在上传比较大的文件的时候,此时可能需要修改