web-dev-qa-db-fra.com

Comment valider la taille de fichier maximale dans Laravel?

J'essaie de valider une taille de fichier maximale de 500 Ko dans Laravel:

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

Mais cela signifie que le fichier doit faire exactement 500 Ko. Comment puis-je modifier cette règle afin qu'elle renvoie une erreur lorsqu'elle dépasse 500 Ko?

J'ai essayé ceci:

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

La documentation ne dit rien à ce sujet:

taille: valeur

Le champ en cours de validation doit avoir une taille correspondant à la valeur donnée. Pour les données de chaîne, la valeur correspond au nombre de caractères. Pour les données numériques, la valeur correspond à une valeur entière donnée. Pour les fichiers, la taille correspond à la taille du fichier en kilo-octets.

32
Jim Peeters

Selon la documentation:

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

La valeur est en kilo-octets. C'est à dire. max:10240 = 10 Mo maximum.

76
Filip Koblański

Edit: Warning! Cette réponse a fonctionné sur mon environnement XAMPP OsX, mais lorsque je l'ai déployée sur AWS EC2, elle n'a PAS empêché la tentative de téléchargement.

J'ai été tenté de supprimer cette réponse car elle est fausse, mais je vais plutôt expliquer ce qui m'a fait trébucher

Mon champ de téléchargement de fichier s'appelle "upload", donc je recevais le message "Le téléchargement n'a pas pu être envoyé.". Ce message provient de cette ligne dans validation.php:

dans resources/lang/en/validaton.php:

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

Et ceci est le message affiché lorsque le fichier dépasse la limite définie par PHP.

Je souhaite remplacer ce message, ce que vous pouvez normalement faire en transmettant un troisième paramètre $ tableau à la méthode Validator :: make ().

Cependant Je ne peux pas le faire car j'appelle le POST d'un React Composant qui rend le formulaire contenant le csrf champ et le champ de téléchargement.

Donc, au lieu de cela, en tant que super-bidouille, j'ai choisi d'entrer dans ma vue qui affiche les messages et remplace ce message spécifique par mon message convivial "fichier trop volumineux".

Voici ce qui fonctionne si la taille du fichier est inférieure à la limite de taille du fichier PHP:

Si quelqu'un d'autre utilise Laravel FormRequest class, voici ce qui a fonctionné pour moi sur Laravel 5.7:

Voici comment définir un message d'erreur personnalisé et une taille de fichier maximale:

J'ai un champ de saisie <input type="file" name="upload">. Notez que le jeton CSRF est également requis sous la forme (google laravel csrf_field pour ce que cela signifie)).

<?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"
    ];
  }
}
0
NULL pointer