Home

视频分片上传至OSS YII PHP

<?php
/**
 * Created by SublimeText3.
 * User: Wcj
 * Date: 2020/02/04
 * Time: 16:46
 */

namespace app\modules\mch\controllers;

use OSS\OssClient;
use OSS\Core\OssException;
class VideoController extends \yii\web\Controller
{
	public $enableCsrfValidation=false;
	public $accessKeyId = "**";
	public $accessKeySecret = "**";
	// Endpoint以杭州为例,其它Region请按实际情况填写。
	public $endpoint = "https://oss-cn-shanghai.aliyuncs.com";
	// 存储空间名称
	public  $bucket = "**";
	public  $object = "test.mp4";

	public function actionShow()
	{
		$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
		$video = $this->request->param('video');
		$signedUrl = $ossClient->signUrl($this->bucket, $video,3600);
		$this->redirect($signedUrl);
	}
	public function actionUpload()
    {
    	$file = $_FILES['file'];
		$size = $this->request('size');
		$total = $this->request('total');
		$md5 = $this->request('md5');
		$md5file = $this->request('md5file');
		$blob_num = $this->request('index');
		$file_name = $this->request('uid');
		$fileName = $this->request('fileName');
		$counts = $this->request('counts');
		$ossParts = $this->request('ossParts');
		$ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
		$this->object = $md5file;
		if($file){			
			if($blob_num == 0){
				$md5file = md5_file($file['tmp_name'])."_".$size.".mp4";
				$this->object = $md5file;
				$exist = $ossClient->doesObjectExist($this->bucket, $this->object);
				if($exist){
					$signedUrl = 'web/index.php?r=mch%2Fvideo%2Fshow&video='.$this->object;
					$this->response(array('status'=>200,'exist'=>1,'url'=>$signedUrl));
				}else{
					$md5 = $ossClient->initiateMultipartUpload($this->bucket, $this->object);	
				}							
			}
			$upOptions = array(
		        $ossClient::OSS_FILE_UPLOAD => $file['tmp_name'],
		        $ossClient::OSS_PART_NUM => ($blob_num + 1),
		        $ossClient::OSS_SEEK_TO => 0,
		        $ossClient::OSS_LENGTH => filesize($file['tmp_name']),
		        $ossClient::OSS_CHECK_MD5 => false,
		    );
			$ret = $ossClient->uploadPart($this->bucket, $this->object, $md5, $upOptions); 
			$this->response(array('status'=>200,'md5'=>$md5,'md5file'=>$md5file,'part'=>str_replace('"', '', $ret),'index'=>$blob_num));
		}else{
			if($counts){
				$uploadParts = [];
				$ossParts = explode(",",$ossParts);
				foreach ($ossParts as $i => $eTag) {
				    $uploadParts[] = array(
				        'PartNumber' => ($i + 1),
				        'ETag' => $eTag,
				    );
				}
				$ret=0;			
		        try {
				    $ret=$ossClient->completeMultipartUpload($this->bucket, $this->object, $md5, $uploadParts);
				}  catch(OssException $e) {
				    printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
				    printf($e->getMessage() . "\n");
				    return;
				}
				$signedUrl = 'web/index.php?r=mch%2Fvideo%2Fshow&video='.$this->object;
				$this->response(array('status'=>200,'return'=>0,'url'=>$signedUrl));
			}
		}
    }

    public function request($key){
		if(isset($_POST[$key])){
			return $_POST[$key];
		}else{
			return 0;
		}
	}
	public function response($arr=array('author'=>'wcj2020'))
	{
		header("Access-Control-Allow-Origin: *");
		header("content:application/json;chartset=uft-8");
		echo json_encode($arr);
		exit();	
	}
}