From 1b5d671c35361c18f73fd1956b35fe78b588d34e Mon Sep 17 00:00:00 2001 From: chuan <2154243450@qq.com> Date: Wed, 15 Jan 2025 20:01:47 +0800 Subject: [PATCH] video on demaind --- app/admin/controller/Test.php | 2 +- app/admin/controller/Upload.php | 158 ++++++++++++++++++++++++++++-- app/admin/route/app.php | 12 ++- app/home/route/app.php | 2 +- app/home/service/VideoService.php | 5 +- 5 files changed, 166 insertions(+), 13 deletions(-) diff --git a/app/admin/controller/Test.php b/app/admin/controller/Test.php index 1b697d4..185f7ce 100644 --- a/app/admin/controller/Test.php +++ b/app/admin/controller/Test.php @@ -8,6 +8,6 @@ class Test extends AdminBaseController { public function index() { - return json(['code' => '0', 'msg' => 'SUCCESS', 'data' => []]); + return json(['code' => '0', 'msg' => 'SUCCESS', 'data' => [$fileName]]); } } \ No newline at end of file diff --git a/app/admin/controller/Upload.php b/app/admin/controller/Upload.php index 4036772..d2b38df 100644 --- a/app/admin/controller/Upload.php +++ b/app/admin/controller/Upload.php @@ -10,7 +10,6 @@ use think\facade\Config; class Upload extends AdminBaseController { - // 上传图片 public function upload() { @@ -56,11 +55,9 @@ class Upload extends AdminBaseController } // 生成唯一的文件名 $fileName = uniqid() . '.' . $file->getOriginalExtension(); - - // 初始化S3客户端 + // 初始化s3客户端 $s3Config = Config::get('common.aws_s3'); - - $s3 = new S3Client([ + $s3Client = new S3Client([ 'version' => 'latest', 'region' => $s3Config['aws_region'], 'credentials' => [ @@ -69,7 +66,7 @@ class Upload extends AdminBaseController ], ]); // 上传文件到S3 - $result = $s3->putObject([ + $result = $s3Client->putObject([ 'Bucket' => $s3Config['aws_bucket'], 'Key' => 'bourse-video-node/' . $fileName, // s3中的存储路径 'Body' => fopen($file->getRealPath(), 'r'), @@ -98,4 +95,153 @@ class Upload extends AdminBaseController } } + // 初始化分片上传 + public function initiateUpload(){ + try { + $param = $this->request->param(); + if (empty($param['file_type'])) { + return json(['code' => '100500', 'message' => '缺少参数 file_type', 'data' => []]); + } + // 允许的视频类型 + $allowed_types = [ + 'video/mp4', + 'video/quicktime', + 'video/x-msvideo', + 'video/x-ms-wmv', + 'video/x-matroska', + ]; + if (!in_array($param['file_type'], $allowed_types)) { + return json(['code' => '100500', 'message' => '上传的文件类型不在允许范围内', 'data' => []]); + } + // 生成唯一的文件名 + $fileName = uniqid('video_', true); + // 初始化s3客户端 + $s3Config = Config::get('common.aws_s3'); + $s3Client = new S3Client([ + 'version' => 'latest', + 'region' => $s3Config['aws_region'], + 'credentials' => [ + 'key' => $s3Config['aws_key'], + 'secret' => $s3Config['aws_secret'], + ], + ]); + // 初始化Multipart Upload + $result = $s3Client->createMultipartUpload([ + 'Bucket' => $s3Config['aws_bucket'], + 'Key' => 'bourse-video-node/' . $fileName, + ]); + return json([ + 'code' => 0, + 'data' => [ + 'uploadId' => $result['UploadId'], + 'key' => $result['Key'] + ] + ]); + } catch (\Exception $exception) { + return json(['code' => '100500', 'message' => '初始化上传失败', 'data' => [$exception->getMessage()]]); + } + } + + // 上传分片 + public function uploadPart(){ + try { + $param = $this->request->param(); + if (empty($param['uploadId']) || empty($param['key']) || empty($param['partNumber'])) { + return json(['code' => 400, 'message' => '缺少参数']); + } + $file = $this->request->file('file'); + if (!$file) { + return json(['code' => 400, 'message' => 'No file uploaded']); + } + // 初始化s3客户端 + $s3Config = Config::get('common.aws_s3'); + $s3Client = new S3Client([ + 'version' => 'latest', + 'region' => $s3Config['aws_region'], + 'credentials' => [ + 'key' => $s3Config['aws_key'], + 'secret' => $s3Config['aws_secret'], + ], + ]); + $result = $s3Client->uploadPart([ + 'Bucket' => $s3Config['aws_bucket'], + 'Key' => $param['key'], + 'PartNumber' => $param['partNumber'], + 'UploadId' => $param['uploadId'], + 'Body' => fopen($file->getRealPath(), 'r'), + ]); + + return json([ + 'code' => 200, + 'data' => [ + 'ETag' => $result['ETag'], + 'PartNumber' => $param['partNumber'] + ] + ]); + } catch (\Exception $exception) { + return json(['code' => '100500', 'message' => '上传失败', 'data' => [$exception->getMessage()]]); + } + } + + // 完成上传 + public function completeUpload(){ + try { + $param = $this->request->param(); + if (empty($param['uploadId']) || empty($param['key']) || empty($param['parts'])) { + return json(['code' => 400, 'message' => '缺少参数']); + } + // 初始化s3客户端 + $s3Config = Config::get('common.aws_s3'); + $s3Client = new S3Client([ + 'version' => 'latest', + 'region' => $s3Config['aws_region'], + 'credentials' => [ + 'key' => $s3Config['aws_key'], + 'secret' => $s3Config['aws_secret'], + ], + ]); + $s3Client->completeMultipartUpload([ + 'Bucket' => $s3Config['aws_bucket'], + 'Key' => $param['key'], + 'UploadId' => $param['uploadId'], + 'MultipartUpload' => [ + 'Parts' => $param['parts'] + ], + ]); + + return json(['code' => 200, 'message' => '上传成功']); + } catch (\Exception $exception) { + return json(['code' => '100500', 'message' => '完成上传失败', 'data' => [$exception->getMessage()]]); + } + } + + // 取消上传 + public function abortUpload(){ + try { + $param = $this->request->param(); + if (empty($param['uploadId']) || empty($param['key'])) { + return json(['code' => 400, 'message' => '缺少参数']); + } + // 初始化s3客户端 + $s3Config = Config::get('common.aws_s3'); + $s3Client = new S3Client([ + 'version' => 'latest', + 'region' => $s3Config['aws_region'], + 'credentials' => [ + 'key' => $s3Config['aws_key'], + 'secret' => $s3Config['aws_secret'], + ], + ]); + $s3Client->abortMultipartUpload([ + 'Bucket' => $s3Config['aws_bucket'], + 'Key' => $param['key'], + 'UploadId' => $param['uploadId'], + ]); + + return json(['code' => 200, 'message' => '上传已取消']); + } catch (\Exception $exception) { + return json(['code' => '100500', 'message' => '取消上传失败', 'data' => [$exception->getMessage()]]); + } + } + } \ No newline at end of file diff --git a/app/admin/route/app.php b/app/admin/route/app.php index 4dd0a9f..a8fa100 100644 --- a/app/admin/route/app.php +++ b/app/admin/route/app.php @@ -23,10 +23,14 @@ Route::group('/', function () { Route::post('/get_config', 'Config/getConfig'); // 视频点播相关 - Route::post('/upload_video', 'Upload/uploadVideo'); //上传视频到aws s3 - Route::post('/video/video_on_demand_list', 'video/videoOnDemandList'); //获取视频点播列表 - Route::post('/video/add_video', 'video/addVideoOnDemand'); //添加点播视频 - Route::post('/video/edit_video', 'video/editVideoOnDemand'); //编辑点播视频 + Route::post('/upload_video', 'Upload/uploadVideo'); //上传视频到aws s3 + Route::post('/initiate_upload', 'Upload/initiateUpload'); //初始化分片上传 + Route::post('/upload_part', 'Upload/uploadPart'); //分片上传 + Route::post('/complete_upload', 'Upload/completeUpload'); //完成分片上传 + Route::post('/abort_upload', 'Upload/abortUpload'); //取消分片上传 + Route::post('/video_on_demand_list', 'video/videoOnDemandList'); //获取视频点播列表 + Route::post('/add_video', 'video/addVideoOnDemand'); //添加点播视频 + Route::post('/edit_video', 'video/editVideoOnDemand'); //编辑点播视频 // 首页数据 Route::post('/index', 'Index/index'); diff --git a/app/home/route/app.php b/app/home/route/app.php index cbb1b0e..9db9446 100644 --- a/app/home/route/app.php +++ b/app/home/route/app.php @@ -281,7 +281,7 @@ Route::group('/',function (){ Route::post('get_ip', 'Login/getIP'); Route::get('get_news', 'News/index'); Route::get('test', 'News/test'); - Route::get('test_api', 'News/testApi'); + Route::get('test_api', 'video/videoOnDemandList'); })->allowCrossDomain($header); diff --git a/app/home/service/VideoService.php b/app/home/service/VideoService.php index c3e2b5a..bd3cbc8 100644 --- a/app/home/service/VideoService.php +++ b/app/home/service/VideoService.php @@ -11,8 +11,11 @@ class VideoService extends BaseHomeService if (empty($param['page']) || !is_numeric($param['page'])) { return $this->toData('1', '参错错误'); } + if (empty($param['limit']) || !is_numeric($param['limit'])) { + return $this->toData('1', '参错错误'); + } $list = VideoOnDemandModel::where(['state'=>1])->order('sort', 'desc')->paginate([ - 'list_rows' => 15, + 'list_rows' => $param['limit'], 'page' => $param['page'], ]); return $this->toData('0', 'Successful', [