type="file" pattern

Eléphant du PHP | 91 Messages

03 janv. 2021, 12:51

Bonjour,
Depuis HTML5 il semblerait que l'on ne puisse utiliser "pattern" pour autoriser ou interdire certains caractères, or, j'aimerais savoir s'il y a un moyen de remédier à ce problème ?
Merci.

<input accept="image/jpeg" type="file" name="image" id="image" data-multiple-caption="{count} files selected"/>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

04 janv. 2021, 12:49

L'attribut pattern fait bien partie de HTML5 : https://www.w3.org/TR/html52/sec-forms. ... -attribute

En revanche, un pattern s'applique à la value du champ concerné du coup je doute que ça fonctionne sur les champs de type "file".
À mon sens ça ne doit fonctionner que sur des champs input de type "text" et ses dérivés (date, search, url, tel, email, password)

Si c'est pour vérifier le type de fichier, tu peux utiliser l'attribut "accept"
https://developer.mozilla.org/fr/docs/W ... ile#accept
Si tu veux faire ta vérification sur les caractères contenus dans le nom du fichier, il va falloir que tu fasses du javascript ou du post-traitement en PHP.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 91 Messages

04 janv. 2021, 13:05

Merci de ta réponse, l'attribut accept se limite au format de fichier et donc en effet va falloir que j'utilise Java pour les caractères autorisés pfff galère

Mammouth du PHP | 1967 Messages

06 janv. 2021, 09:20

Tu peux aussi renommer le fichier aprés upload en remplacant les caractères non autorisé par un _ par exemple.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 91 Messages

06 janv. 2021, 10:13

Oui en effet c'est une possibilité, mais remplacer les é è ê ë, les espaces, quand il y a plusieurs champs type="file" ça risque d'être lourd non?

Mammouth du PHP | 1967 Messages

06 janv. 2021, 12:56

non ce n'est pas trés couteux car pour l'upload tu dois utilisé la fonction move_upload_file qui permet de renommer dans la foulée. un petit coup de strtr sur le filename et le tour est joué
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 91 Messages

06 janv. 2021, 14:25

move_upload_file c'est pour transférer pas pour renommer ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

06 janv. 2021, 15:32

Ça transfère le fichier uploadé en spécifiant son nom donc si tu indiques un autre nom ça le renommera en même temps.
C'est d'ailleurs la meilleure solution, quasiment aucun site n'impose de restriction sur le nommage des fichiers à uploader, c'est traité côté serveur.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 91 Messages

07 janv. 2021, 18:33

Bonjour,
Pour renommer le fichier j'ai essayé avec preg_replace, pour les espaces ça fonctionne mais pas pour les lettres accentuées.

<?php
$dossier = '/upload/';
$<?php
$dossier = '/upload/';
$image = basename($_FILES['image']['name']);
$taille_maxi = 1024 * 1024;
$taille = filesize($_FILES['image']['tmp_name']);
$extensions = array('.jpg', '.jpeg');
$extension = strrchr($_FILES['image']['name'], '.');
if(!in_array($extension, $extensions))
{
echo '<p class="erreur">L'image doit être au format jpg ou jpeg</p>';
}
if($taille>$taille_maxi)
{
echo '<p class="erreur">Le poids de la vignette dépasse 1 Mo</p>';
}
if(!isset($erreur))
{
$image = strtr($vignette,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
$image = preg_replace('/([^.a-z0-9]+)/i', '-', $image);
if(move_uploaded_file($_FILES['image']['tmp_name'], $dossier . $image))
{
}
else
{
echo '<p class="erreur">Echec de transfert de l'image !</p>';
}
}
else
{
echo $erreur;
}
?>

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

08 janv. 2021, 09:43

Moi je fais ça pour nettoyer une string :
<?php
$string = "Öh Fóø Bår PHPfrance Héhé_&=)@ç<> ^ ok.xlsx";

// Remplacement des caractères accentués
$string = html_entity_decode(preg_replace('/&([a-z])(acute|uml|circ|grave|ring|cedil|slash|tilde|caron|lig|quot|rsquo);/i', '\\1', htmlentities($string, ENT_COMPAT, 'utf-8')));

// Retrait de tous les caractères autres qu'alpha-numériques pour les remplacer par des tirets
$string = trim(preg_replace(array('/[^a-z0-9\.-]/i', '/[-]+/') , '-', $string), '-');

var_dump($string);
Quand tout le reste a échoué, lisez le mode d'emploi...