44
55use EasyCorp \Bundle \EasyAdminBundle \Form \DataTransformer \StringToFileTransformer ;
66use EasyCorp \Bundle \EasyAdminBundle \Form \Type \Model \FileUploadState ;
7+ use League \Flysystem \FilesystemOperator ;
78use Symfony \Component \Form \AbstractType ;
89use Symfony \Component \Form \DataMapperInterface ;
910use Symfony \Component \Form \Extension \Core \Type \CheckboxType ;
@@ -38,14 +39,15 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
3839 $ uploadFilename = $ options ['upload_filename ' ];
3940 $ uploadValidate = $ options ['upload_validate ' ];
4041 $ allowAdd = $ options ['allow_add ' ];
41- unset($ options ['upload_dir ' ], $ options ['upload_new ' ], $ options ['upload_delete ' ], $ options ['upload_filename ' ], $ options ['upload_validate ' ], $ options ['download_path ' ], $ options ['allow_add ' ], $ options ['allow_delete ' ], $ options ['compound ' ]);
42+ $ filesystemOperator = $ options ['filesystem_operator ' ];
43+ unset($ options ['upload_dir ' ], $ options ['upload_new ' ], $ options ['upload_delete ' ], $ options ['upload_filename ' ], $ options ['upload_validate ' ], $ options ['download_path ' ], $ options ['allow_add ' ], $ options ['allow_delete ' ], $ options ['compound ' ], $ options ['filesystem_operator ' ]);
4244
4345 $ builder ->add ('file ' , FileType::class, $ options );
4446 $ builder ->add ('delete ' , CheckboxType::class, ['required ' => false ]);
4547
4648 $ builder ->setDataMapper ($ this );
4749 $ builder ->setAttribute ('state ' , new FileUploadState ($ allowAdd ));
48- $ builder ->addModelTransformer (new StringToFileTransformer ($ uploadDir , $ uploadFilename , $ uploadValidate , $ options ['multiple ' ]));
50+ $ builder ->addModelTransformer (new StringToFileTransformer ($ uploadDir , $ uploadFilename , $ uploadValidate , $ options ['multiple ' ], $ filesystemOperator ));
4951 }
5052
5153 public function buildView (FormView $ view , FormInterface $ form , array $ options ): void
@@ -76,12 +78,26 @@ public function buildView(FormView $view, FormInterface $form, array $options):
7678
7779 public function configureOptions (OptionsResolver $ resolver ): void
7880 {
79- $ uploadNew = static function (UploadedFile $ file , string $ uploadDir , string $ fileName ) {
80- $ file ->move ($ uploadDir , $ fileName );
81+ $ uploadDir = fn (Options $ options ) => $ options ['filesystem_operator ' ] ? null : $ this ->projectDir .'/public/uploads/files/ ' ;
82+
83+ $ uploadNew = static function (UploadedFile $ file , ?string $ uploadDir , string $ fileName , ?FilesystemOperator $ filesystemOperator = null ) {
84+ if (null === $ filesystemOperator ) {
85+ $ file ->move ($ uploadDir , $ fileName );
86+ } else {
87+ if (false === $ fh = fopen ($ file ->getPathname (), 'rb ' )) {
88+ throw new InvalidArgumentException (sprintf ('Unable to open file %s for reading ' , $ file ->getPathname ()));
89+ }
90+ $ filesystemOperator ->writeStream ($ uploadDir .'/ ' .$ fileName , $ fh );
91+ fclose ($ fh );
92+ }
8193 };
8294
83- $ uploadDelete = static function (File $ file ) {
84- unlink ($ file ->getPathname ());
95+ $ uploadDelete = static function (File $ file , ?FilesystemOperator $ filesystemOperator = null ) {
96+ if (null === $ filesystemOperator ) {
97+ unlink ($ file ->getPathname ());
98+ } else {
99+ $ filesystemOperator ->delete ($ file ->getPathname ());
100+ }
85101 };
86102
87103 $ uploadFilename = static fn (UploadedFile $ file ): string => $ file ->getClientOriginalName ();
@@ -109,7 +125,7 @@ public function configureOptions(OptionsResolver $resolver): void
109125 $ emptyData = static fn (Options $ options ) => $ options ['multiple ' ] ? [] : null ;
110126
111127 $ resolver ->setDefaults ([
112- 'upload_dir ' => $ this -> projectDir . ' /public/uploads/files/ ' ,
128+ 'upload_dir ' => $ uploadDir ,
113129 'upload_new ' => $ uploadNew ,
114130 'upload_delete ' => $ uploadDelete ,
115131 'upload_filename ' => $ uploadFilename ,
@@ -123,18 +139,24 @@ public function configureOptions(OptionsResolver $resolver): void
123139 'required ' => false ,
124140 'error_bubbling ' => false ,
125141 'allow_file_upload ' => true ,
142+ 'filesystem_operator ' => null ,
126143 ]);
127144
128- $ resolver ->setAllowedTypes ('upload_dir ' , ' string ' );
145+ $ resolver ->setAllowedTypes ('upload_dir ' , [ ' null ' , ' string '] );
129146 $ resolver ->setAllowedTypes ('upload_new ' , 'callable ' );
130147 $ resolver ->setAllowedTypes ('upload_delete ' , 'callable ' );
131148 $ resolver ->setAllowedTypes ('upload_filename ' , ['string ' , 'callable ' ]);
132149 $ resolver ->setAllowedTypes ('upload_validate ' , 'callable ' );
133150 $ resolver ->setAllowedTypes ('download_path ' , ['null ' , 'string ' ]);
134151 $ resolver ->setAllowedTypes ('allow_add ' , 'bool ' );
135152 $ resolver ->setAllowedTypes ('allow_delete ' , 'bool ' );
153+ $ resolver ->setAllowedTypes ('filesystem_operator ' , ['null ' , FilesystemOperator::class]);
154+
155+ $ resolver ->setNormalizer ('upload_dir ' , function (Options $ options , ?string $ value ): ?string {
156+ if (null === $ value ) {
157+ return null ;
158+ }
136159
137- $ resolver ->setNormalizer ('upload_dir ' , function (Options $ options , string $ value ): string {
138160 if (\DIRECTORY_SEPARATOR !== mb_substr ($ value , -1 )) {
139161 $ value .= \DIRECTORY_SEPARATOR ;
140162 }
0 commit comments