Skip to content

Commit a54e4e6

Browse files
authored
Merge pull request #2237 from opensource-workshop/feature/uploadfile-bulk-delete
[アップロードファイル管理] 複数ファイルの一括削除機能を追加&ファイル容量表示を追加
2 parents 243fde7 + a8bb7ab commit a54e4e6

File tree

6 files changed

+284
-14
lines changed

6 files changed

+284
-14
lines changed

app/Plugins/Manage/SiteManage/SiteManage.php

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2001,14 +2001,8 @@ private function zeroSuppress($id, $size = 4)
20012001
*/
20022002
public function total($request, $id = null)
20032003
{
2004-
$total = 0;
2005-
// ディレクトリの全ファイル一覧
2006-
$files = FileUtils::getFileList(base_path());
2007-
foreach ($files as $file) {
2008-
$total += filesize($file);
2009-
}
2010-
// 単位付与
2011-
$total = FileUtils::getFormatSizeDecimalPoint($total);
2004+
// 総使用量を取得
2005+
$total = FileUtils::getTotalUsageFormatted(base_path());
20122006

20132007
return view('plugins.manage.site.total', [
20142008
"function" => __FUNCTION__,

app/Plugins/Manage/UploadfileManage/UploadfileManage.php

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
use Illuminate\Support\Facades\File;
66
use Illuminate\Support\Facades\Storage;
77
use Illuminate\Support\Facades\Validator;
8+
use Illuminate\Support\Facades\Log;
89

910
use App\Models\Common\Uploads;
1011
use App\Models\Core\Configs;
12+
use App\Utilities\File\FileUtils;
1113

1214
use App\Plugins\Manage\ManagePluginBase;
1315
use 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
}

app/Utilities/File/FileUtils.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,4 +110,25 @@ public static function toValidFilename(string $filename): string
110110
];
111111
return strtr($filename, $invalid_chars);
112112
}
113+
114+
/**
115+
* 指定ディレクトリの総使用量を計算(フォーマット済み文字列で返却)
116+
*
117+
* @param string $dir 計算対象ディレクトリ
118+
* @return string フォーマット済みサイズ(例: "123.45MB")
119+
*/
120+
public static function getTotalUsageFormatted(string $dir): string
121+
{
122+
// ディレクトリが存在しない場合は "0B" を返す
123+
if (!is_dir($dir)) {
124+
return '0B';
125+
}
126+
127+
$total = 0;
128+
$files = self::getFileList($dir);
129+
foreach ($files as $file) {
130+
$total += filesize($file);
131+
}
132+
return self::getFormatSizeDecimalPoint($total);
133+
}
113134
}

resources/views/plugins/manage/site/site_manage_tab.blade.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@
5555

5656
<li role="presentation" class="nav-item">
5757
@if ($function == "total")
58-
<span class="nav-link"><span class="active">使用容量</span></span>
58+
<span class="nav-link"><span class="active">使用量</span></span>
5959
@else
60-
<a href="{{url('/manage/site/total')}}" class="nav-link">使用容量</a>
60+
<a href="{{url('/manage/site/total')}}" class="nav-link">使用量</a>
6161
@endif
6262
</li>
6363

resources/views/plugins/manage/site/total.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
@include('plugins.manage.site.site_manage_tab')
1818
</div>
1919
<div class="card-body">
20-
ファイル使用容量: {{ $total }}
20+
サイト全体の使用量: {{ $total }}
2121
</div>
2222
</div>
2323

0 commit comments

Comments
 (0)