Aller au contenu

renommer un upload


Sujets conseillés

Posté

bonjour,

J'utilise pour mon site un script d'upload de photo, mais le probleme est avec le nom de ces photos!

Si le nom de la photo uploader existe deja, il remplace l'ancienne photo!

Du coup je peut peut me retrouvez avec plusieur utilisateur qui ont la meme photo si ils l'ont tous apellés "ma_photo.jpg"!

Et pire si quelqu'un decide de suprimer sa photo...

Voila je voulais savoir quelle technique vous avez adopter pour parer ce genre de probleme ou s'il y a une astuce?

le script que j'utilise est celui-ci:

 if(!empty($_FILES['image']["name"])){

$repertoireDestination = "ImgArtiste/";
$poidsFichier = $_FILES['image']["size"];
$nomDestination = $_FILES["image"]["name"];
$extension = strrchr( $nomDestination, ".");


if(isExtAuthorized($extension)){
if($poidsFichier < $MAX_FILE_SIZE){
if (is_uploaded_file($_FILES["image"]["tmp_name"])) {
if (move_uploaded_file($_FILES['image']['tmp_name'],
$repertoireDestination.$nomDestination)) {
echo "Le fichier temporaire ".$_FILES["image"]["tmp_name"].
" a été déplacé vers ".$repertoireDestination.$nomDestination;
} else {
echo "Le déplacement du fichier temporaire a échoué".
" vérifiez l'existence du répertoire ".$repertoireDestination;
}
} else {
echo "L'enregistrement a échoué<br>votre photo est trop grosse!";
}
}else {
echo "L'enregistrement a échoué<br>votre photo est trop grosse!";
}
}

}

Merci a vous!!

Posté

Salut,

Au lieu de laisser le choix du nom de l'image à l'utilisateur, tu devrais l'imposer.

Par exemple, en fonction de l'utilisateur, tu pourrais faire un truc du genre :

$nomDestination = $utilisateur.$var;

avec $utilisateur qui représente l'utilisateur et $var une variable incrémentée automatiquement à partir d'une base de données par exemple).

comme ça tous les noms de photos seront uniques.

++

Patrick

Posté

merci de votre reponse!

J 'avais deja penser a une incrementation mais ça ne me paraissait pas top!

Par contre je vien d'avoir une idée!

comment je pourrait faire pour apliquer a $nomdedestination="annee-jour-heure -minute-sec-millisecondes.jpg"

es ce qu'on peut avoir ça avec une funtion date? oui je metrise pas trop php mais je vais regarder vite fait!

merci

Posté

Bien sûr :

$nomdedestination = date("Y-m-d-H-i-s-").rand(1000,9999).".jpg";

Moi j'ai ajouté le rand() car mon serveur traite plusieurs envois par seconde et du coup j'avais des doublons !

Posté

bonjour,

Et bien je vois que je n'ai encore rien inventer!!

En tout cas c'est que l'idée était bonne!

Merci a vous c'est exactement ce que je cherchait!!

cordialement

Posté

Je te mets un code copier-coller de mes codes, donc regarde un peu, il doit y avoir quelques variables à modifier...

// On liste tous les fichiers qu'il y a dans le dossier.
$fichiers = $this->ListeDossier($dossier);

// On fait une boucle tant que le fichier existe
$i = 0;
$nv_name = $nom_pur.'.'.$ext;

while (in_array($nv_name, $fichiers))
{
$nv_name = $nom_pur.'('.$i++.')'.'.'.$ext;
}

$fname = $nv_name;

// La fonction listeDossier
function ListeDossier($dir)
{
$dh = opendir(ROOT.$dir);
while (false !== ($filename = readdir($dh)))
{
$files[] = $filename;
}

$fichiers = array();
$i = 0;
foreach($files as $file)
{
if ($file != '.' && $file != '..' && !is_dir($file))
$fichiers[$i++] = $file;
}
return $fichiers;
}

Ca te permet de garder le même nom de fichier, ou bien de l'adapter par des (0),(1) au cas où...

Posté

Moi je partais du principe de renommer toujours pour :

1) virer tous les caractères exotiques, passer en minuscules

2) ajouter l'id de l'uploader ou la référence associée...

Posté

Je suis parfaitement d'accord avec Sébastien (iNCiTEWeb).

Le contrôle des informations envoyées par formulaire doit-être systématique, question de sécurité en plus d'éviter des formats de données non compatibles entre ce qui est saisi et ta base de données.

++

Patrick

Posté

date("Y-m-d-H-i-s-") > Autant mettre un 'timestamp' > time().

Et pourquoi pas y ajouter les microsecondes :> microtime()

Suffixé à l'identifiant de l'utilisateur, et le tour est joué.

Pour le nom du fichier ? Ben simple : une base de données, et d'un coté le nom de l'utilisateur, et de l'autre le nom du fichier.

Y'a des droits ? Simple :> comparer les id user <> id_user_photo

Ou une colonne pour dire 'tout le monde', ou 'juste l'user'.

J'ai toujours renommé les docs : Une cvthèque, c'est bien connu : tout le monde envoie son cv comme ca : cv.doc :D

Posté (modifié)

bonjour,

J'ai donc realisé la petite modification du code qui marche tres bien maintenant!

Je post donc le resultat pour les prochains qui liront ce post!

Pour le modifier le nom de destination par la date j'ai donc remplacer:

$nomDestination = $_FILES["image"]["name"];

par:

$nomDestination = date("Y-m-d-H-i-s-").rand(1000,9999).".jpg";

Ce qui marchait tres bien, mais qui imposait uploader que des images ".jpg"

donc voici la correction finale qui modifie le nom et garde l'extension originale:

// Définition des extensions de fichier autorisées (avec le ".")

$AUTH_EXT = array( ".jpg",".JPG", ".jpeg",".JPEG",".gif",".GIF",".bmp",".BMP",".png",".PNG",".mp3",".MP3",".wav",".WAV") ;

// Fonction permettant de vérifier si l'extension du fichier est

// autorisée.

function isExtAuthorized( $ext){

global $AUTH_EXT;

if(in_array($ext, $AUTH_EXT)){

return true;

}else{

echo"extension non valide";

return false;

}

if(!empty($_FILES['image']["name"])){

$repertoireDestination = "ImgArtiste/";

$extension = strrchr( $_FILES['image']["name"], ".") ;

$nomDestination = date("Y-m-d-H-i-s-").rand(1000,9999).$extension;

if(isExtAuthorized($extension)){

...( enregistrement)...

Encore merci a vous pour toutes vos reponse...

Je retourne au travail...

@+

milou

Modifié par milou39
Posté

Si je peux me permettre, profites en pour séparer les fichiers en plusieurs dossiers... car à moins d'utiliser un système de fichier vraiment adapté (reiserFS ?) avoir plusieurs dizaines / centaines de milliers de fichiers dans le même dossier, ça n'aide jamais.

C'est évidement à étudier en fonction du volume total ainsi que de la fréquence de mise à jour, mais ça pourrait par exemple donner ça :

$nomDestination = date("Y-m/d/H-i-s-").rand(1000,9999).".jpg";

Bon évidement, il faut aussi assurer la création des dossiers le moment venu.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...