Переглянути джерело

feat: compressao de imagens + limitacao de tamanho no upload de imagens para 5mb

Gustavo Zanatta 2 тижнів тому
батько
коміт
2eb1c078c9

+ 1 - 1
app/Http/Controllers/UserController.php

@@ -98,7 +98,7 @@ class UserController extends Controller
 
     public function uploadAvatar(Request $request): JsonResponse
     {
-        $request->validate(['photo' => 'required|image|max:5120']);
+        $request->validate(['photo' => 'required|image|max:' . config('uploads.max_size_kb')]);
 
         $user = Auth::user();
         $this->mediaService->uploadUserAvatar($request->file('photo'), $user);

+ 1 - 1
app/Http/Requests/CompanyHeroImageRequest.php

@@ -9,7 +9,7 @@ class CompanyHeroImageRequest extends FormRequest
     public function rules(): array
     {
         return [
-            'image' => 'required|image|max:8192',
+            'image' => 'required|image|max:' . config('uploads.max_size_kb'),
         ];
     }
 }

+ 1 - 1
app/Http/Requests/EventCoverRequest.php

@@ -9,7 +9,7 @@ class EventCoverRequest extends FormRequest
     public function rules(): array
     {
         return [
-            'image' => 'required|image|max:8192',
+            'image' => 'required|image|max:' . config('uploads.max_size_kb'),
         ];
     }
 }

+ 1 - 1
app/Http/Requests/FirstAccessRegisterRequest.php

@@ -39,7 +39,7 @@ class FirstAccessRegisterRequest extends FormRequest
             'sector_id'    => 'required|integer|exists:sectors,id',
             'password'     => ['required', 'confirmed', Password::min(8)->mixedCase()->numbers()],
             'terms_accepted' => ['accepted'],
-            'photo'        => ['nullable', Rule::requiredIf(fn(): bool => !$user?->photo_path), 'image', 'max:5120'],
+            'photo'        => ['nullable', Rule::requiredIf(fn(): bool => !$user?->photo_path), 'image', 'max:' . config('uploads.max_size_kb')],
         ];
     }
 

+ 1 - 1
app/Http/Requests/NotificationRequest.php

@@ -16,7 +16,7 @@ class NotificationRequest extends FormRequest
             'recipient'              => ['sometimes', Rule::enum(NotificationRecipientEnum::class)],
             'recipient_position_id'  => 'sometimes|nullable|integer|exists:positions,id',
             'recipient_sector_id'    => 'sometimes|nullable|integer|exists:sectors,id',
-            'image'                  => 'sometimes|nullable|file|mimes:jpg,jpeg,png,webp|max:5120',
+            'image'                  => 'sometimes|nullable|file|mimes:jpg,jpeg,png,webp|max:' . config('uploads.max_size_kb'),
         ];
 
         if ($this->isMethod('post')) {

+ 1 - 1
app/Http/Requests/UploadLogoRequest.php

@@ -9,7 +9,7 @@ class UploadLogoRequest extends FormRequest
     public function rules(): array
     {
         return [
-            'logo' => 'required|image|max:4096',
+            'logo' => 'required|image|max:' . config('uploads.max_size_kb'),
         ];
     }
 }

+ 1 - 1
app/Http/Requests/UploadMediaRequest.php

@@ -9,7 +9,7 @@ class UploadMediaRequest extends FormRequest
     public function rules(): array
     {
         return [
-            'file' => 'required|file|max:10240',
+            'file' => 'required|file|max:' . config('uploads.max_size_kb'),
         ];
     }
 }

+ 1 - 1
app/Http/Requests/UserDependentRequest.php

@@ -29,7 +29,7 @@ class UserDependentRequest extends FormRequest
             $rules['responsible_user_id'] = 'required|integer|exists:users,id';
             $rules['name']                = 'required|string|max:255';
             $rules['kinship']             = ['required', Rule::enum(KinshipEnum::class)];
-            $rules['document']            = 'required|file|mimes:jpg,jpeg,png,webp,pdf|max:10240';
+            $rules['document']            = 'required|file|mimes:jpg,jpeg,png,webp,pdf|max:' . config('uploads.max_size_kb');
         }
 
         return $rules;

+ 15 - 1
bootstrap/app.php

@@ -3,6 +3,8 @@
 use Illuminate\Foundation\Application;
 use Illuminate\Foundation\Configuration\Exceptions;
 use Illuminate\Foundation\Configuration\Middleware;
+use Illuminate\Http\Exceptions\PostTooLargeException;
+use Illuminate\Http\Request;
 use Illuminate\Console\Scheduling\Schedule;
 use App\Http\Middleware\SetUserLanguage;
 use App\Http\Middleware\CheckPermission;
@@ -30,6 +32,18 @@ return Application::configure(basePath: dirname(__DIR__))
         $schedule->call(new DeleteExpiredTokens)->everyMinute();
     })
     ->withExceptions(function (Exceptions $exceptions) {
-        //
+        // Anexo maior que o post_max_size do PHP: responde em JSON no lugar do
+        // erro cru, para o front conseguir mostrar a mensagem ao usuário.
+        $exceptions->render(function (PostTooLargeException $e, Request $request) {
+            if (!$request->expectsJson()) {
+                return null;
+            }
+
+            return response()->json([
+                'message' => __('http.payload_too_large', [
+                    'max' => round(config('uploads.max_size_kb') / 1024, 1),
+                ]),
+            ], 413);
+        });
     })
     ->create();

+ 18 - 0
config/uploads.php

@@ -0,0 +1,18 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Limite de tamanho dos anexos
+    |--------------------------------------------------------------------------
+    |
+    | Valor em kilobytes usado pelas regras de validação de upload (regra "max").
+    | É o mesmo limite aplicado no front, que comprime a imagem antes de enviar
+    | quando ela ultrapassa esse tamanho.
+    |
+    */
+
+    'max_size_kb' => (int) env('UPLOAD_MAX_SIZE_KB', 5120),
+
+];

+ 1 - 0
lang/en/http.php

@@ -32,6 +32,7 @@ return [
     'gateway_timeout' => 'Gateway timeout',
     'not_implemented' => 'Not implemented',
     'not_acceptable' => 'Not acceptable',
+    'payload_too_large' => 'The uploaded file exceeds the :max MB limit',
     'not_allowed' => 'Method not allowed',
     'not_acceptable' => 'Not acceptable',
     'webhook_received' => 'Webhook received',

+ 1 - 0
lang/es/http.php

@@ -32,6 +32,7 @@ return [
     'gateway_timeout' => 'Tiempo de espera de la puerta de enlace',
     'not_implemented' => 'No implementado',
     'not_acceptable' => 'No aceptable',
+    'payload_too_large' => 'El archivo enviado supera el límite de :max MB',
     'not_allowed' => 'Método no permitido',
     'webhook_received' => 'Webhook recibido',
     'unauthorized_ip' => 'IP no autorizada',

+ 1 - 0
lang/pt/http.php

@@ -32,6 +32,7 @@ return [
     'gateway_timeout' => 'Tempo de espera do gateway',
     'not_implemented' => 'Não implementado',
     'not_acceptable' => 'Não aceitável',
+    'payload_too_large' => 'O arquivo enviado excede o limite de :max MB',
     'not_allowed' => 'Método não permitido',
     'webhook_received' => 'Webhook recebido',
     'unauthorized_ip' => 'Endereço IP não autorizado',