Browse Source

video on demaind

master
chuan 2 months ago
parent
commit
1b5d671c35
  1. 2
      app/admin/controller/Test.php
  2. 158
      app/admin/controller/Upload.php
  3. 12
      app/admin/route/app.php
  4. 2
      app/home/route/app.php
  5. 5
      app/home/service/VideoService.php

2
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]]);
}
}

158
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()]]);
}
}
}

12
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');

2
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);

5
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', [

Loading…
Cancel
Save