0
votes

Valider le type mime xml dans Laravel

J'ai un validateur mis en place pour vérifier si le document que nous téléchargeons est un fichier XML

if ($request->input('action') == 'upload_document') {
    $validator = Validator::make($request->all(), [
        'file' => 'bail|required|mimes:application/xml,xml|max:10000',
        ]
    );
}

Mais quand je fais mon upload, ce validateur me déclenche une erreur "Le fichier doit être de type application / xml, xml" même lorsque je dépose un vrai fichier XML avec une extension .xml.

J'ai dans mon php.ini config extension = php_fileinfo.dll bien sûr


2 commentaires

Je suppose que le serveur Web est défini sur text/xml qui est le paramètre de type mime le plus courant pour xml nos jours.


J'ai essayé et cela ne fonctionne malheureusement pas avec text / xml aussi


3 Réponses :


1
votes

Notez que la validation de type mime demande à Laravel de lire le contenu du fichier pour déterminer son type, donc changer une extension d'image de .jpg  à .xml ne le .xml pas.

À partir des documents

mimes: foo, bar , ...

Le fichier en cours de validation doit avoir un type MIME correspondant à l'une des extensions répertoriées.

Utilisation de base de la règle MIME

Route::post('/', function (Request $request) {
    if ($request->input('action') == 'upload_document') {
        $request->validate([
            'file' => [
                'bail',
                'required',
                'max:10000',
                function ($attribute, $value, $fail) {
                    if ($value->getClientMimeType() !== 'text/xml') {
                        $fail($attribute.'\'s extension is invalid.');
                    }
                },
            ]
        ]);
        dd('the file is valid');
    }
});

Même si vous ne devez spécifier que les extensions, cette règle valide en fait le type MIME du fichier en lisant le contenu du fichier et en devinant son type MIME.

Une liste complète des types MIME et de leurs extensions correspondantes peut être trouvée à l'emplacement suivant: https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

Assurez-vous donc que votre fichier est un fichier xml valide (essayez ceci avec phpunit.xml) de votre projet Laravel

The file must be a file of type: application/xml, xml.

Et une forme comme celle-ci

"the file is valid"

Résultat:

<form method="post" enctype="multipart/form-data">
    @csrf
    <input name="action" value="upload_document">
    <input type="file" name="file">
    <button type="submit">Submit</button>
</form>
@error('file')
{{ $message }}
@enderror

Mais lors des tests avec image.xml

Route::post('/', function (Request $request) {
    if ($request->input('action') == 'upload_document') {
        $validator = Validator::make(
            $request->all(),
            [
                'file' => 'bail|required|mimes:application/xml,xml|max:10000',
            ]
        );
        $validator->validate();
        dd('the file is valid');
    }
});

 Alternativement, vous pouvez valider par extension

'photo' => 'mimes:jpeg,bmp,png'

Maintenant, un fichier image avec l'extension xml passe la validation

Voir utilisation des fermetures pour une validation personnalisée


6 commentaires

Merci pour ce long post, mais la première solution déclenche la même erreur que ma façon d'utiliser le validateur


Incluez le fichier XML que vous essayez de valider dans votre question


et la deuxième solution par extension ne fournit aucun objet validateur et la validation de la requête me fournit juste un tableau avec un fichier à l'intérieur, mais je ne sais pas si cela signifie que le validateur était ok ou non et je n'en ai pas statut pour ce rappel de validate.


dropbox.com/transfer/...


Le type mime de ce fichier est 'text / xml', et il passe la validation sur ma machine, le problème n'est PAS dans votre code


Malheureusement, ce n'est pas un problème avec "mon" fichier, mais le fichier que certains partenaires me fournissent, et je n'ai pas la main dessus. En tout cas merci pour le travail que tu as fait



0
votes

Il semble que le XML fourni par une société externe ne respecte pas la norme XML appropriée.

Comme il n'est pas entre mes mains, je ne le reformaterai pas et je devrai le gérer uniquement sous forme de texte. Donc je suppose que je ne peux pas utiliser de validateur dans mon cas.


0 commentaires

0
votes

Pour ceux qui essaient de passer l'extension xml sur Laravel 5 (comme moi). Cela fonctionnera également avec d'autres extensions supplémentaires.

Puisque Laravel ExtensionGuesser permet d'ajouter un devineur personnalisé via le registre de méthode, nous faisons ce qui suit.

  1. Créez une nouvelle classe avec son propre tableau d'extensions. Je l'ai fait en étendant l'original pour qu'il corresponde à l'interface. Je l'ai mis dans le dossier Helpers.
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;

public function store (Request $request) {

        if ($request->hasFile('file')) {

            $guesser = ExtensionGuesser::getInstance(); //take the guesser who will guess
            $guesser->register(new \App\Helpers\PriorExtensionGuesser()); //add own guesser

            $validator = Validator::make($request->all(), [

                'file' => 'file|mimes:txt,xls,xlsx,csv,xml|max:32768',

            ]);

            if ($validator->fails()) {
.....

  1. Dans votre contrôleur (n'oubliez pas d'utiliser l'instruction):
<?php

namespace App\Helpers;

use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeExtensionGuesser;

/**
 * Provides a best-guess mapping of mime type to file extension.
 */
class PriorExtensionGuesser extends MimeTypeExtensionGuesser
{
    /**
     * Addition to pretty old map of mime types and their default extensions.
     *
     * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
     */
    protected $defaultExtensions = array(
        'text/xml' => 'xml',
    );

}

Alors maintenant, le devineur vérifie notre tableau dans la classe Prior * puis passe à l'original.


0 commentaires