1010use App \Models \Version ;
1111use Illuminate \Http \JsonResponse ;
1212use Illuminate \Support \Facades \Storage ;
13+ use Illuminate \Support \Str ;
1314
1415class FileAttachmentController extends Controller
1516{
@@ -31,7 +32,7 @@ public function store(StoreFileAttachmentRequest $request, Version $version): Js
3132 $ path = $ uploadedFile ->store ("attachments/ {$ version ->id }" , $ disk );
3233
3334 $ attachment = $ version ->fileAttachments ()->create ([
34- 'filename ' => $ uploadedFile ->getClientOriginalName (),
35+ 'filename ' => $ this -> sanitizeFilename ( $ uploadedFile ->getClientOriginalName () ),
3536 'file_path ' => $ path ,
3637 'mime_type ' => $ uploadedFile ->getClientMimeType (),
3738 'size ' => $ uploadedFile ->getSize (),
@@ -63,7 +64,7 @@ public function update(UpdateFileAttachmentRequest $request, Version $version, F
6364 $ path = $ uploadedFile ->store ("attachments/ {$ version ->id }" , $ disk );
6465
6566 $ fileAttachment ->update ([
66- 'filename ' => $ uploadedFile ->getClientOriginalName (),
67+ 'filename ' => $ this -> sanitizeFilename ( $ uploadedFile ->getClientOriginalName () ),
6768 'file_path ' => $ path ,
6869 'mime_type ' => $ uploadedFile ->getClientMimeType (),
6970 'size ' => $ uploadedFile ->getSize (),
@@ -89,4 +90,15 @@ protected function ensureRelationship(Version $version, FileAttachment $attachme
8990 {
9091 abort_if ($ attachment ->version_id !== $ version ->id , 404 );
9192 }
93+
94+ protected function sanitizeFilename (string $ originalName ): string
95+ {
96+ $ basename = pathinfo ($ originalName , PATHINFO_FILENAME );
97+ $ extension = strtolower ((string ) pathinfo ($ originalName , PATHINFO_EXTENSION ));
98+
99+ $ safeBase = preg_replace ('/[^A-Za-z0-9._ -]/ ' , '- ' , $ basename ) ?: 'file ' ;
100+ $ safeBase = trim ((string ) Str::of ($ safeBase )->squish ()->limit (100 , '' ));
101+
102+ return $ extension !== '' ? $ safeBase .'. ' .$ extension : $ safeBase ;
103+ }
92104}
0 commit comments