55use Illuminate \Support \Facades \File ;
66use Illuminate \Support \Facades \Storage ;
77use Illuminate \Support \Facades \Validator ;
8+ use Illuminate \Support \Facades \Log ;
89
910use App \Models \Common \Uploads ;
1011use App \Models \Core \Configs ;
12+ use App \Utilities \File \FileUtils ;
1113
1214use App \Plugins \Manage \ManagePluginBase ;
1315use App \Traits \ConnectCommonTrait ;
@@ -29,6 +31,11 @@ class UploadfileManage extends ManagePluginBase
2931{
3032 use ConnectCommonTrait;
3133
34+ /**
35+ * 表示件数の許可された値
36+ */
37+ private $ allowed_per_page = [10 , 50 , 100 ];
38+
3239 /**
3340 * 権限定義
3441 */
@@ -46,6 +53,7 @@ public function declareRole()
4653 $ role_ckeck_table ["saveUserdir " ] = array ('admin_site ' );
4754 $ role_ckeck_table ["userdirPublic " ] = array ('admin_site ' );
4855 $ role_ckeck_table ["deleteUserdirPublic " ] = array ('admin_site ' );
56+ $ role_ckeck_table ["bulkDelete " ] = array ('admin_site ' );
4957 return $ role_ckeck_table ;
5058 }
5159
@@ -104,8 +112,21 @@ public function index($request)
104112 $ uploads_query ->orderBy ('download_count ' , 'desc ' );
105113 }
106114
115+ // 表示件数の取得 ※デフォルトは10件
116+ $ per_page = $ this ->allowed_per_page [0 ];
117+ if ($ request ->session ()->has ('uploadfile_per_page ' )) {
118+ $ per_page = (int )$ request ->session ()->get ('uploadfile_per_page ' );
119+ // 許可された値のみを使用
120+ if (!in_array ($ per_page , $ this ->allowed_per_page )) {
121+ $ per_page = $ this ->allowed_per_page [0 ];
122+ }
123+ }
124+
107125 // データ取得
108- $ uploads = $ uploads_query ->paginate (10 , null , 'page ' , $ page );
126+ $ uploads = $ uploads_query ->paginate ($ per_page , null , 'page ' , $ page );
127+
128+ // 使用量の計算
129+ $ storage_usage = $ this ->getStorageUsage ();
109130
110131 // 入力値をsessionへ保存(検索用)
111132 $ request ->flash ();
@@ -115,6 +136,8 @@ public function index($request)
115136 "function " => __FUNCTION__ ,
116137 "plugin_name " => "uploadfile " ,
117138 "uploads " => $ uploads ,
139+ "allowed_per_page " => $ this ->allowed_per_page ,
140+ "storage_usage " => $ storage_usage ,
118141 ]);
119142 }
120143
@@ -131,6 +154,11 @@ public function search($request)
131154
132155 session (["search_condition " => $ search_condition ]);
133156
157+ // 表示件数は独立して保存(条件設定中バッジの対象外)
158+ if ($ request ->has ('uploadfile_per_page ' )) {
159+ session (['uploadfile_per_page ' => $ request ->input ('uploadfile_per_page ' )]);
160+ }
161+
134162 return redirect ("/manage/uploadfile " );
135163 }
136164
@@ -341,4 +369,77 @@ public function deleteUserdirPublic($request)
341369
342370 return redirect ("/manage/uploadfile/userdirPublic " )->with ('flash_message ' , '削除しました。 ' );
343371 }
372+
373+ /**
374+ * アップロードファイルの一括削除処理
375+ *
376+ * @param $request
377+ */
378+ public function bulkDelete ($ request )
379+ {
380+ // 選択されたファイルIDの確認
381+ if (!$ request ->has ('selected_files ' ) || !is_array ($ request ->selected_files )) {
382+ return redirect ('/manage/uploadfile/ ' )->with ('flash_error_message ' , '削除するファイルが選択されていません。 ' );
383+ }
384+
385+ $ deleted_files = [];
386+ $ error_files = [];
387+
388+ foreach ($ request ->selected_files as $ upload_id ) {
389+ try {
390+ $ upload = Uploads::findOrFail ($ upload_id );
391+
392+ // ファイル削除
393+ Storage::delete ($ this ->getDirectory ($ upload ->id ) . '/ ' . $ upload ->id . '. ' . $ upload ->extension );
394+
395+ // レコード削除
396+ $ deleted_files [] = $ upload ->client_original_name ;
397+ $ upload ->delete ();
398+
399+ } catch (\Exception $ e ) {
400+ Log::error ('UploadfileManage: Bulk delete failed for file ID: ' . $ upload_id , ['error ' => $ e ->getMessage ()]);
401+ $ error_files [] = "ID: " . $ upload_id ;
402+ }
403+ }
404+
405+ $ message = count ($ deleted_files ) . "件のファイルを削除しました。 " ;
406+ if (!empty ($ error_files )) {
407+ $ message .= " ※削除に失敗したファイル: " . implode (', ' , $ error_files );
408+ Log::error ('UploadfileManage: Bulk delete failed for files: ' . implode (', ' , $ error_files ));
409+ }
410+
411+ return redirect ('/manage/uploadfile/ ' )->with ('flash_message ' , $ message );
412+ }
413+
414+ /**
415+ * ストレージ使用量を取得
416+ *
417+ * @return array
418+ */
419+ private function getStorageUsage () : array
420+ {
421+ $ usage = [];
422+
423+ // 総使用量(アプリケーションルート配下)
424+ $ startTime = microtime (true );
425+ $ usage ['total ' ] = FileUtils::getTotalUsageFormatted (base_path ());
426+ $ totalElapsed = microtime (true ) - $ startTime ;
427+ Log::info ('UploadfileManage: Total usage calculation completed ' , [
428+ 'path ' => base_path (),
429+ 'size ' => $ usage ['total ' ],
430+ 'elapsed_time ' => number_format ($ totalElapsed , 3 ) . 's '
431+ ]);
432+
433+ // ファイル使用量(storage/app/uploads配下)
434+ $ startTime = microtime (true );
435+ $ usage ['uploads ' ] = FileUtils::getTotalUsageFormatted (storage_path ('app/uploads ' ));
436+ $ uploadsElapsed = microtime (true ) - $ startTime ;
437+ Log::info ('UploadfileManage: Uploads usage calculation completed ' , [
438+ 'path ' => storage_path ('app/uploads ' ),
439+ 'size ' => $ usage ['uploads ' ],
440+ 'elapsed_time ' => number_format ($ uploadsElapsed , 3 ) . 's '
441+ ]);
442+
443+ return $ usage ;
444+ }
344445}
0 commit comments