From c22449774096a613fb711ace1647242e09c22ff2 Mon Sep 17 00:00:00 2001 From: Sallu9007 Date: Sun, 11 May 2025 14:59:00 +0530 Subject: [PATCH] Feat: Bulk file downloads --- .../ActivitiesAttendedController.php | 69 +- .../pages/activities-attended/index.blade.php | 770 +++++++++++------- routes/web.php | 2 + 3 files changed, 529 insertions(+), 312 deletions(-) diff --git a/app/Http/Controllers/ActivitiesAttendedController.php b/app/Http/Controllers/ActivitiesAttendedController.php index b2d5c7a..9c42b3f 100644 --- a/app/Http/Controllers/ActivitiesAttendedController.php +++ b/app/Http/Controllers/ActivitiesAttendedController.php @@ -39,7 +39,7 @@ class ActivitiesAttendedController extends Controller 'activity_type' => 'required|string', 'category' => 'required|string', 'level' => 'required|string', - 'proof' => 'nullable|mimes:jpg,jpeg,png,pdf,doc,docx,zip', + 'proof' => 'nullable|mimes:jpg,jpeg,png,pdf,doc,docx,zip,ppt,pptx|max:5120', // 5MB max ]); // Combine start date and time @@ -113,6 +113,73 @@ class ActivitiesAttendedController extends Controller return response()->json(['success' => 'Record deleted successfully']); } + public function downloadProofs(Request $request) + { + // Validate the request + $request->validate([ + 'ids' => 'required|string', + ]); + + $ids = json_decode($request->input('ids')); + + if (empty($ids)) { + return back()->with('error', 'No items selected'); + } + + // Get the records with proofs + $responses = ActivitiesAttended::whereIn('id', $ids) + ->whereNotNull('proof') + ->get(); + + if ($responses->isEmpty()) { + return back()->with('error', 'No valid proofs found'); + } + + // Create a temporary zip file + $zipFileName = 'proofs_' . time() . '.zip'; + $zipFilePath = storage_path('app/public/temp/' . $zipFileName); + + // Ensure the temp directory exists + if (!Storage::disk('public')->exists('temp')) { + Storage::disk('public')->makeDirectory('temp'); + } + + $zip = new \ZipArchive(); + + if ($zip->open($zipFilePath, \ZipArchive::CREATE) !== TRUE) { + return back()->with('error', 'Could not create zip file'); + } + + $fileCount = 0; + + foreach ($responses as $response) { + if (Storage::disk('public')->exists($response->proof)) { + $fileContent = Storage::disk('public')->get($response->proof); + + // Get original filename from path + $originalName = basename($response->proof); + + // Add file to the zip with a prefix to avoid duplicate names + $fileNameInZip = $response->id . '_' . $originalName; + $zip->addFromString($fileNameInZip, $fileContent); + $fileCount++; + } + } + + $zip->close(); + + if ($fileCount === 0) { + // Delete the empty zip file + if (file_exists($zipFilePath)) { + unlink($zipFilePath); + } + return back()->with('error', 'No files found to download'); + } + + // Return the zip file as a download + return response()->download($zipFilePath, $zipFileName)->deleteFileAfterSend(true); + } + public function getActivitiesAttendedResponses(Request $request) { $user = auth()->user(); diff --git a/resources/views/pages/activities-attended/index.blade.php b/resources/views/pages/activities-attended/index.blade.php index 5e95a3f..7670149 100644 --- a/resources/views/pages/activities-attended/index.blade.php +++ b/resources/views/pages/activities-attended/index.blade.php @@ -61,67 +61,67 @@
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
- +
@@ -139,12 +139,18 @@
+ + +
+ @@ -263,321 +269,421 @@ @endsection @section('scripts') - + -
ID Title Organising Institute