Jump to content

renommer un upload


milou39

Recommended Posts

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!!

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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 !

Link to post
Share on other sites

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ù...

Link to post
Share on other sites

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...

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

Edited by milou39
Link to post
Share on other sites

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.

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...