You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
2.7 KiB

2 weeks ago
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\CourseMedia;
use App\Support\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UploadController extends Controller
{
use ApiResponse;
/** 课程封面 / 宣传页等图片上传,存 public 盘并写入 course_media */
public function courseAsset(Request $request): JsonResponse
{
$data = $request->validate([
'file' => ['required', 'file', 'image', 'max:5120'],
'subdir' => ['required', 'string', 'in:covers,promos'],
]);
$uploaded = $request->file('file');
$path = $uploaded->store("courses/{$data['subdir']}", 'public');
$url = CourseMedia::publicAssetUrl($path) ?? '';
$media = CourseMedia::query()->create([
'disk' => 'public',
'path' => $path,
'url' => $url,
'category' => $data['subdir'],
'original_name' => $uploaded->getClientOriginalName(),
'mime_type' => $uploaded->getClientMimeType(),
'size_bytes' => $uploaded->getSize() ?: null,
]);
return $this->ok($media->toApiArray(), '已上传');
}
/** 资讯封面图上传,存 public 盘并返回 URL */
public function newsCover(Request $request): JsonResponse
{
$data = $request->validate([
'file' => ['required', 'file', 'image', 'max:5120'],
]);
$uploaded = $request->file('file');
$path = $uploaded->store('news/covers', 'public');
$url = CourseMedia::publicAssetUrl($path) ?? '';
return $this->ok(['url' => $url], '已上传');
}
/** Banner 自定义封面图上传 */
public function bannerCover(Request $request): JsonResponse
{
$data = $request->validate([
'file' => ['required', 'file', 'image', 'max:5120'],
]);
$uploaded = $request->file('file');
$path = $uploaded->store('banners/covers', 'public');
$url = CourseMedia::publicAssetUrl($path) ?? '';
return $this->ok(['url' => $url], '已上传');
}
5 days ago
/** 富文本编辑器内嵌图片上传 */
public function editorImage(Request $request): JsonResponse
{
$data = $request->validate([
'file' => ['required', 'file', 'image', 'max:5120'],
'scope' => ['nullable', 'string', 'in:courses,activities,news,banners,common'],
]);
$scope = $data['scope'] ?? 'common';
$uploaded = $request->file('file');
$path = $uploaded->store("editor/{$scope}", 'public');
$url = CourseMedia::publicAssetUrl($path) ?? '';
return $this->ok(['url' => $url], '已上传');
}
2 weeks ago
}