'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 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; } }