Laravel: ¿Validar el tamaño máximo de archivo?

4 minutos de lectura

Avatar de usuario de Jim Peeters
Jim Peters

Estoy tratando de validar en un tamaño de archivo máximo de 500 kb en Laravel:

$validator = Validator::make($request->all(), [
    'file' => 'size:500',
]);

Pero esto dice que el archivo debe tener exactamente 500 kb de tamaño. ¿Cómo puedo editar esta regla para que devuelva un error cuando tenga más de 500 kb?

He intentado esto:

'file' => 'size:>=500'
'file'  => 'size:max:500'

La documentación no dice nada sobre esto:

tamaño:valor

El campo bajo validación debe tener un tamaño que coincida con el valor dado. Para datos de cadena, el valor corresponde al número de caracteres. Para datos numéricos, el valor corresponde a un valor entero dado. Para los archivos, el tamaño corresponde al tamaño del archivo en kilobytes.

  • use **archivo’ => ‘tamaño: 500’ ** . es decir, el tamaño del archivo no supera los 500 kb

    – Yasin Patel

    25 de mayo de 2016 a las 9:25

  • @YasinPatel te equivocas, el size la validación es el valor exacto

    – Filip Koblański

    25 de mayo de 2016 a las 9:29

Avatar de usuario de Filip Koblański
Filip Koblański

De acuerdo a la documentación:

$validator = Validator::make($request->all(), [
    'file' => 'max:500000',
]);

El valor está en kilobytes, por ejemplo:

  • max:10240 = máximo 10 MB.

  • max:1 = máximo 1024 bytes.

Nota que hay esfuerzos para cambiar el valor de 1 kilobytes del original 1024 a 1000 bytes, pero grandes marcos como Laravel permanecer usando original 1024 valor, lo que evita la confusión de los desarrolladores senior (que están acostumbrados a 1024).

  • Esta solución no funcionó para mí. Imagen de 6,5 MB cargada por el sistema. El código es $validator = Validator::make($request->all(), [ ‘profile_image’=>’mimes:jpeg,jpg,png|max:2000’ ]);

    – Kamlesh

    8 de febrero de 2020 a las 8:23

  • ¿Podría agregar un enlace a la documentación? no pude encontrarlo

    – Félix Geenen

    5 de marzo de 2021 a las 16:19

  • Se alude en la documentación del atributo máximo, laravel.com/docs/8.x/validation#rule-maxindicando que funciona de la misma manera que el tamaño, y la documentación del tamaño: laravel.com/docs/8.x/validation#rule-sizeque indica que está en kilobytes.

    – JVE999

    8 mayo 2021 a las 0:35

Avatar de usuario del puntero NULL
Puntero nulo

Edito: ¡Advertencia! Esta respuesta funcionó en mi entorno XAMPP OsX, pero cuando la implementé en AWS EC2 NO evitó el intento de carga.

Tuve la tentación de eliminar esta respuesta porque está INCORRECTA, pero en su lugar, explicaré qué me hizo tropezar.

Mi campo de carga de archivos se llama ‘cargar’, por lo que recibí “La carga no se pudo cargar”. Este mensaje proviene de esta línea en validation.php:

en recursos/lang/en/validaton.php:

'uploaded' => 'The :attribute failed to upload.',

Y este es el mensaje que se muestra cuando el archivo es más grande que el límite establecido por PHP.

Quiero anular este mensaje, lo que normalmente puede hacer pasando un tercer parámetro $messages array al método Validator::make().

Sin embargo No puedo hacer eso porque estoy llamando al POST desde un componente React, que representa el formulario que contiene el campo csrf y el campo de carga.

Entonces, en cambio, como un truco súper dudoso, elegí ingresar a mi vista que muestra los mensajes y reemplazar ese mensaje específico con mi mensaje amigable ‘archivo demasiado grande’.

Esto es lo que funciona si el archivo es más pequeño que el límite de tamaño del archivo PHP:

En caso de que alguien más esté usando la clase FormRequest de Laravel, esto es lo que funcionó para mí en Laravel 5.7:

Así es como configuro un mensaje de error personalizado y un tamaño máximo de archivo:

tengo un campo de entrada <input type="file" name="upload">. Tenga en cuenta que el token CSRF también se requiere en el formulario (google laravel csrf_field para saber lo que esto significa).

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class Upload extends FormRequest
{
  ...
  ...
  public function rules() {
    return [
      'upload' => 'required|file|max:8192',
    ];
  }
  public function messages()
  {
    return [            
      'upload.required' => "You must use the 'Choose file' button to select which file you wish to upload",
      'upload.max' => "Maximum file size to upload is 8MB (8192 KB). If you are uploading a photo, try to reduce its resolution to make it under 8MB"
    ];
  }
}

¿Ha sido útil esta solución?