Page 1 sur 1
type="file" pattern
Posté : 03 janv. 2021, 12:51
par ChrisCMoi62
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"/>
Re: type="file" pattern
Posté : 04 janv. 2021, 12:49
par @rthur
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.
Re: type="file" pattern
Posté : 04 janv. 2021, 13:05
par ChrisCMoi62
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
Re: type="file" pattern
Posté : 06 janv. 2021, 09:20
par Spols
Tu peux aussi renommer le fichier aprés upload en remplacant les caractères non autorisé par un _ par exemple.
Re: type="file" pattern
Posté : 06 janv. 2021, 10:13
par ChrisCMoi62
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?
Re: type="file" pattern
Posté : 06 janv. 2021, 12:56
par Spols
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é
Re: type="file" pattern
Posté : 06 janv. 2021, 14:25
par ChrisCMoi62
move_upload_file c'est pour transférer pas pour renommer ?
Re: type="file" pattern
Posté : 06 janv. 2021, 15:32
par @rthur
Ç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.
Re: type="file" pattern
Posté : 07 janv. 2021, 18:33
par ChrisCMoi62
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;
}
?>
Re: type="file" pattern
Posté : 08 janv. 2021, 09:43
par @rthur
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);