'import-temp/', 'avatar' => 'user-avatar/', 'dataDiri' => 'data-diri/', 'claim-result' => 'claim/', 'claim-diagnosis' => 'claim/', 'claim-kondisi' => 'claim/', 'claim-invoice' => 'claim/', 'final-log-result' => 'final-log/', 'final-log-diagnosis' => 'final-log/', 'final-log-kondisi' => 'final-log/', 'docs' => 'docs/', 'additional-files' => 'additional-files/', 'chat' => 'chat/', 'files-proof-payment' => 'files-proof-payment/', ]; public function fileable() { return $this->morphTo(); } public static function getDirectory($type) { return self::$file_directories[$type] ?? 'any/'; } public static function getFileName($type, $id) { return $type . '-' . $id . '-' . Str::random(10); } public function getNameAttribute($value) { return !empty($this->original_name) ? $this->original_name : ($value . '.' . $this->extension); } public function getUrlAttribute() { // Jika path kosong, kembalikan null if (!$this->path) { return null; } // Cek nilai 'source'. Jika 's3', gunakan disk S3. // Selain itu (termasuk null atau 'local'), gunakan disk 'public'. if ($this->source === 's3') { try { return Storage::disk('s3')->temporaryUrl( $this->path, now()->addMinutes(60) // expired 1 jam ); } catch (\Exception $e) { return Storage::disk('s3')->url($this->path); // fallback kalau public } } return Storage::disk('public')->url($this->path); } // public static function storeFile($type, $id, $file) // { // // $fileName = self::getFileName($type, $id); // $fileName = $file->getClientOriginalName(); // $directory = self::getDirectory($type); // $extension = $file->getClientOriginalExtension(); // $path = $directory . $fileName . '.' . $extension; // $file->storeAs('public/' . $directory, $fileName); // return $path; // } // public static function storeFile($type, $id, $file) // { // // Pastikan directory tidak punya trailing slash // $directory = rtrim(self::getDirectory($type), '/'); // // Buat nama file yang unik dan aman // $originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); // $extension = $file->getClientOriginalExtension(); // $safeName = Str::slug($originalName); // $uniqueName = $safeName . '-' . uniqid() . '.' . $extension; // // Upload file ke disk 's3' dengan visibility 'public' // $path = Storage::disk('s3')->putFileAs( // $directory, // $file, // $uniqueName, // 'public' // ); // // Kembalikan path dan nama unik agar bisa digunakan di controller // return [ // 'path' => $directory . '/' . $uniqueName, // hasil konsisten // 'name' => $uniqueName, // ]; // } public static function storeFile($type, $id, $file) { // 1. Ambil nama disk dari konfigurasi default // Nilainya akan 'public', 'local', atau 's3' tergantung .env Anda $disk = config('filesystems.default'); $directory = rtrim(self::getDirectory($type), '/'); // Buat nama file yang unik dan aman (kode Anda sudah bagus) $originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME); $extension = $file->getClientOriginalExtension(); $safeName = Str::slug($originalName); $uniqueName = $safeName . '-' . uniqid() . '.' . $extension; // 2. Gunakan disk yang sudah dinamis $path = Storage::disk($disk)->putFileAs( $directory, $file, $uniqueName ); // 3. (Sangat Direkomendasikan) Tambahkan penanganan error if ($path === false) { Log::error("Gagal menyimpan file ke disk '{$disk}' pada path: {$directory}/{$uniqueName}"); return false; // Kembalikan false jika upload gagal } // 4. Kembalikan path asli dari hasil upload untuk konsistensi return [ 'path' => $path, // Gunakan $path yang dikembalikan oleh Storage 'name' => $uniqueName, ]; } public static function storeFileChat($type, $id, $file) { // $fileName = self::getFileName($type, $id); $fileName = $file->getClientOriginalName(); $directory = self::getDirectory($type); $extension = $file->getClientOriginalExtension(); $path = $directory . $fileName . '.' . $extension; $file->store('public/' .$path); return $path; } }