Question

J'ai un « Dilema » et je me demande ce qui est des meilleures pratiques d'affaires.

J'utilise Uploadify pour télécharger des images. Maintenant, je dois valider le nom du fichier avant d'enregistrer le fichier.

Je l'ai regardé à différentes solutions, mais ne peut pas descendre à une bonne solution.

Voici mes critères:

  • Nom du fichier doit être tout en minuscules
  • Nom du fichier ne peut contenir que charaters [a-z0-9 _-]
  • Je dois pouvoir renommer le fichier

Comment feriez-vous si un nom de fichier est my.file(name).jpeg?

Je pourrais exploser le nom du fichier sur « » et enregistrez l'extension, puis imploser pour obtenir le nom de fichier nouveau. Mais pas sûr que ce soit le meilleur soltion.

Je possède les fonctions suivantes qui aide un peu:

function getExts($filename) 
{ 
    $exts = explode("[/\\.]", $filename) ; 
    $n = count($exts)-1; 
    $exts = $exts[$n]; 
    return $exts; 
}

function validFilename($filename)
{
    $filename = str_replace(" ", "_", $filename);
    $pattern = "/[^[a-z0-9_-]/";
    return preg_replace($pattern, "", strtolower($filename));
} 

Mettre à Jour 1 Je recieving le fichier par $ _FILES. Cela me donne les données suivantes:

  • $ _ FILES [ "file"] [ "nom"] - le nom du fichier téléchargé
  • $ _ FILES [ "file"] [ "type"] - le type du fichier téléchargé
  • $ _ FILES [ "file"] [ "taille"] - la taille en octets du fichier téléchargé
  • $ _ FILES [ "file"] [ "tmp_name"] - le nom de la copie temporaire du fichier stocké sur le serveur
  • $ _ FILES [ "file"] [ "erreur"] - le code d'erreur résultant du téléchargement de fichier

MISE À JOUR 2 Je viens de trouver quelque chose. Je pourrais utiliser getimagesize qui renvoie un tableau de 7 éléments. L'un de ces éléments [2] est IMAGETYPE_XXX.

J'essayer d'utiliser ce code:

function getExts2($filename)
{
    list(,,$type) = getimagesize($filename);
    return $type;
}

Mais il ne retourne que le numéro 2 ...

(J'ai aussi essayé d'utiliser exif_imagetype, mais seulement obtenir Erreur PHP:. Appel à la fonction non définie )

Était-ce utile?

La solution

Vérifiez le nom de fichier avec regex. Utilisez les informations sur le type MIME. Enregistrer le fichier sur le serveur avec le nom md5. Conservez le nom de fichier réel sur db.

Autres conseils

pathinfo () pouvez-vous obtenir le nom du fichier et l'extension. Je vous préviens que vous ne pouvez pas compter sur le test de l'extension d'un fichier par l'inspection de son nom de fichier, cependant. Vous voulez utiliser une fonction qui inspecte réellement le contenu binaire d'un fichier pour cela. finfo_file () peut y arriver. Oh, et ça fait mal de ne jamais utiliser basename () sur un chemin de fichier fourni par l'utilisateur pour éviter un chemin attaque traversal.

Je suppose que vous validez les noms de fichiers pour une utilisation ultérieure en tant que noms de fichiers de téléchargement.

Alors qu'il serait bon de conserver les noms de fichiers comme ils sont dans l'intérêt de l'utilisateur, d'un point de vue technique, votre approche semble son.

Si vous vous souciez de ce que les URL ressemblent, et peut cibler un public international à l'avenir, assurez-vous de convertir soit trémas à leurs caractères de base ou de les convertir. Un utilisateur allemand (trémas Ä Ö Ü ß) s'attend la conversion:

Ä = ae
Ö = oe
Ü = ue

alors que les Scandinaves semblent être à l'aise avec

Ä => a
Ö => o
Ø => o

et ainsi de suite.

Ensuite, il y a les différents caractères accentués é ... ó á

Dropping les conduit tout à fait à des URL qui ont l'air vraiment et bd lok strng dans la br adresse bwsr.

Cela devrait faire tout ce que vous voulez:

$filename = preg_replace('/[^[a-z0-9_-]/', '', str_replace(' ', '_', strtolower(pathinfo($filename, PATHINFO_FILENAME)))) . pathinfo($filename, PATHINFO_EXTENSION);

Et comme Pekka il expliqué, si vous voulez substituer tout au nom accentuation du fichier que vous pouvez utiliser la fonction suivante:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

Je ne pense pas que vous devriez « valider » le nom du fichier, vous devez juste « réparer » si elle est pas dans le format que vous voulez. Pourquoi rejeter un fichier juste parce que quelqu'un aspire à nommer leurs fichiers, ou a des personnages hors du commun là-dedans? En outre, si vous travaillez avec des images, vous pouvez utiliser getimagesize comme vous l'avez mentionné pour vous assurer qu'il est en fait une image qui a été téléchargé (devrait échouer si ce n'est pas une image).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top