This commit is contained in:
2026-06-03 12:11:28 +03:30
parent bae1a2acb0
commit 0cb4954579
6 changed files with 51 additions and 15 deletions
+5 -2
View File
@@ -2,6 +2,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Traits\StoresUploads;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
@@ -12,6 +13,8 @@
*/ */
abstract class CatalogController extends Controller abstract class CatalogController extends Controller
{ {
use StoresUploads;
/** @return class-string<\Illuminate\Database\Eloquent\Model> */ /** @return class-string<\Illuminate\Database\Eloquent\Model> */
abstract protected function modelClass(): string; abstract protected function modelClass(): string;
@@ -52,7 +55,7 @@ public function store(Request $request)
foreach ($this->fileFields() as $field => $config) { foreach ($this->fileFields() as $field => $config) {
$attributes[$config['column']] = $request->hasFile($field) $attributes[$config['column']] = $request->hasFile($field)
? $request->file($field)->store($config['folder'], 'public') ? $this->storeUpload($request->file($field), $config['folder'])
: null; : null;
} }
@@ -82,7 +85,7 @@ public function update(Request $request, $id)
if ($item->{$config['column']}) { if ($item->{$config['column']}) {
Storage::disk('public')->delete($item->{$config['column']}); Storage::disk('public')->delete($item->{$config['column']});
} }
$item->{$config['column']} = $request->file($field)->store($config['folder'], 'public'); $item->{$config['column']} = $this->storeUpload($request->file($field), $config['folder']);
} }
} }
+11 -4
View File
@@ -8,13 +8,14 @@
use App\Models\SubCategory; use App\Models\SubCategory;
use App\Models\Tag; use App\Models\Tag;
use App\Traits\HandlesImageUpload; use App\Traits\HandlesImageUpload;
use App\Traits\StoresUploads;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
class MediaController extends Controller class MediaController extends Controller
{ {
use HandlesImageUpload; use HandlesImageUpload, StoresUploads;
// CREATE media // CREATE media
public function store(Request $request) public function store(Request $request)
@@ -41,19 +42,23 @@ public function store(Request $request)
$path = null; $path = null;
if ($request->hasFile('file')) { if ($request->hasFile('file')) {
$path = $request->file('file')->store('media', 'public'); $path = $this->storeUpload($request->file('file'), 'media');
} }
// An uploaded image file takes precedence over a provided image_id. // An uploaded image file takes precedence over a provided image_id.
$imageId = $this->uploadedImageId($request) ?? ($data['image_id'] ?? null); $imageId = $this->uploadedImageId($request) ?? ($data['image_id'] ?? null);
// When a file is uploaded, expose its public URL as external_url too
// (older front-end versions read external_url for the playable source).
$externalUrl = $path ? asset('storage/' . $path) : ($data['external_url'] ?? null);
$media = Media::create([ $media = Media::create([
'user_id' => auth()->id(), 'user_id' => auth()->id(),
'title' => $data['title'], 'title' => $data['title'],
'caption' => $data['caption'] ?? null, 'caption' => $data['caption'] ?? null,
'type' => $data['type'], 'type' => $data['type'],
'file_path' => $path, 'file_path' => $path,
'external_url' => $data['external_url'] ?? null, 'external_url' => $externalUrl,
'image_id' => $imageId, 'image_id' => $imageId,
'duration' => $data['duration'] ?? null, 'duration' => $data['duration'] ?? null,
'visibility' => $data['visibility'] ?? 'public', 'visibility' => $data['visibility'] ?? 'public',
@@ -488,7 +493,9 @@ public function update(Request $request, $id)
// --- handle file replace --- // --- handle file replace ---
if ($request->hasFile('file')) { if ($request->hasFile('file')) {
Storage::disk('public')->delete($media->file_path); Storage::disk('public')->delete($media->file_path);
$data['file_path'] = $request->file('file')->store('media', 'public'); $data['file_path'] = $this->storeUpload($request->file('file'), 'media');
// Keep external_url pointing at the newly uploaded file for the old front-end.
$data['external_url'] = asset('storage/' . $data['file_path']);
} }
// --- Prepare update data --- // --- Prepare update data ---
+4 -3
View File
@@ -6,11 +6,12 @@
use App\Models\MusicPlaylist; use App\Models\MusicPlaylist;
use App\Models\Music; use App\Models\Music;
use App\Traits\HandlesImageUpload; use App\Traits\HandlesImageUpload;
use App\Traits\StoresUploads;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
class MusicController extends Controller class MusicController extends Controller
{ {
use HandlesImageUpload; use HandlesImageUpload, StoresUploads;
// Add this new method to your MusicController // Add this new method to your MusicController
public function getAllMusic() public function getAllMusic()
@@ -160,7 +161,7 @@ public function store(Request $request)
], 422); ], 422);
} }
$path = $file->store('music', 'public'); $path = $this->storeUpload($file, 'music');
if (!$path) { if (!$path) {
return response()->json([ return response()->json([
@@ -248,7 +249,7 @@ public function update(Request $request, $id)
if ($request->hasFile('file')) { if ($request->hasFile('file')) {
// Delete old file // Delete old file
Storage::disk('public')->delete($music->file_path); Storage::disk('public')->delete($music->file_path);
$path = $request->file('file')->store('music', 'public'); $path = $this->storeUpload($request->file('file'), 'music');
$music->file_path = $path; $music->file_path = $path;
} }
+1 -2
View File
@@ -35,8 +35,7 @@ class Media extends Model
'saved_count', 'saved_count',
'is_liked', 'is_liked',
'likes_count', 'likes_count',
'is_liked', 'url',
'likes_count',
]; ];
public function image() public function image()
{ {
+4 -1
View File
@@ -4,6 +4,7 @@
use App\Models\Image; use App\Models\Image;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Str;
trait HandlesImageUpload trait HandlesImageUpload
{ {
@@ -18,7 +19,9 @@ protected function uploadedImageId(Request $request, string $field = 'image'): ?
return null; return null;
} }
$path = $request->file($field)->store('images', 'public'); $file = $request->file($field);
$ext = $file->getClientOriginalExtension() ?: ($file->guessExtension() ?: 'jpg');
$path = $file->storeAs('images', Str::random(40) . '.' . $ext, 'public');
return Image::create([ return Image::create([
'user_id' => auth()->id(), 'user_id' => auth()->id(),
+23
View File
@@ -0,0 +1,23 @@
<?php
namespace App\Traits;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Str;
trait StoresUploads
{
/**
* Store an uploaded file under a random name while preserving its real
* extension (from the original filename). Laravel's default store() derives
* the extension from the sniffed MIME type, which yields ".bin" for files
* that sniff as application/octet-stream (e.g. some valid .mp3 files).
*/
protected function storeUpload(UploadedFile $file, string $folder, string $disk = 'public'): string
{
$ext = $file->getClientOriginalExtension()
?: ($file->guessExtension() ?: 'bin');
return $file->storeAs($folder, Str::random(40) . '.' . $ext, $disk);
}
}