Comment remplacer des fichiers existants

Fermé
Dz - 15 juin 2021 à 09:59
 Dz - 16 juin 2021 à 15:21
Bonjour,

Je souhaite faire en sorte de supprimer les fichiers déjà stockés sur le serveur. Lorsque l'utilisateur fournit un nouveau document, je vérifie si le fichier existe déjà et si l'extension n'est pas le même alors il est supprimé et remplacé par le nouveau document. En principe ça devrait fonctionner mais c'est un échec ... Je ne trouve pas mon erreur...

Voici le code :

// Récupère la liste de document
  $requete = "SELECT document_soc, document_fonction, document_upl, document_obligatoire FROM recrut.documents WHERE document_soc = '$societe' AND document_fonction = '$fonction' ORDER BY document_obligatoire DESC, document_upl ASC;";

  // Envoie de la requête
  $result = $mysqli->query($requete) or die($requete . " " . $mysqli->error);

  $data = $result -> fetch_all();

  $total_ligne = count($data);


for($i=0; $i<=$total_ligne; $i++) 
{
   foreach ($result as $ligne) {
	$value = $ligne['document_upl'];

	$_FILES["tmp_name"]='./img_tmp/';

	// Recuperation des extensions
	$infosfichier[$i] = pathinfo($_FILES["upload$i"]['name']);
	$extension_upload[$i] = $infosfichier[$i]['extension'];

  if (file_exists("./img_tmp/".$_GET['user_id']."-".$value."*") && move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]) !== "./img_tmp/".$_GET['user_id']."-".$value.".".$extension_upload[$i])
  {
    array_map('unlink', glob("./img_tmp/".$_GET['user_id']."-".$value.".*"));
  }

	// Upload fichiers dans img_tmp
	move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]); 


J'espère que quelqu'un pourra m'aider.
A voir également:

5 réponses

jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
15 juin 2021 à 10:08
Bonjour,

Commence par découper ton code au lieu d'essayer de tout faire en une seule ligne de code

Ajoutes y ensuite un peu de debug .. des echo, des var_dump de tes variables...

Pense aussi à activer l'affichage des erreurs PHP

Et puis.. ça ne marche pas... ça ne nous permet pas vraiment de t'aider.
Il faudrait à minima expliquer en quoi "ça ne marche pas" ... Message d'erreur ? Comportement non conforme à l'attendu ? ( et en quoi il est non conforme.. )

0
J'aimerai bien mais je ne vois pas trop comment faire pour découper une condition après j'ai essayé de tester séparément la fonction "file_exist" avec un var_dump et ça me retourne : bool(false) => 8 fois par rapport au nombre de fichier que l'utilisateur doit fournir.

Ce qui ne marche pas c'est la suppression, après l'upload du fichier fonctionne. Je me retrouve en quelques sorte avec des doublons juste l'extension qui change et j'aimerai remplacer le fichier lorsqu'il détecte que ce n'est pas la même extension de fichier.

En tout cas merci pour votre réponse !
0
Pour le coup j'ai un peu changé ma condition j'arrive à supprimer si le fichier existe mais le problème c'est que ça me supprime tout les fichiers vu que je l'ai mise dans la boucle. Je n'ai pas de document qui s'ajoute...

clearstatcache();

  if (move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]) !== file_exists("./img_tmp/".$_GET['user_id']."-".$value.".*"))
  {
    array_map('unlink', glob("./img_tmp/".$_GET['user_id']."-".$value.".*"));
  }

      // Upload fichiers dans img_tmp
	    move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]); 
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
16 juin 2021 à 10:17
Il faut que tu supprimes ... AVANT de l'uploader....
En gros.. tu testes si le file_exists
Si oui.. tu supprimes
Et ensuite.. tu move_uploaded ..
0
Dz > jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024
16 juin 2021 à 10:27
il faut que je la mette en dehors de ma boucle for si j'ai bien compris ?

le code doit être comme ça ? J'ai fait le teste et rien ne se produit, j'ai des doublons et aucune suppression...

 $value = $ligne['document_upl'];
  clearstatcache();

  if (file_exists("./img_tmp/".$_GET['user_id']."-".$value.".*"))
  {
    array_map('unlink', glob("./img_tmp/".$_GET['user_id']."-".$value.".*"));
  }

for($i=0; $i<=$total_ligne; $i++) 
{
  foreach ($result as $ligne) {
	$value = $ligne['document_upl'];

	$_FILES["tmp_name"]='./img_tmp/';

	// Recuperation des extensions
	$infosfichier[$i] = pathinfo($_FILES["upload$i"]['name']);
	$extension_upload[$i] = $infosfichier[$i]['extension'];

  
      // Upload fichiers dans img_tmp
	    move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]); 
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705 > Dz
16 juin 2021 à 11:14
je n'ai pas dit de le mettre en dehors de ta boucle ....

d'ailleurs si tu fais ça ... la variable $value n'existe pas encore.. donc.. normal que ça ne marche pas !

je t'ai juste dit de découper ton code en deux étapes au lieu d'essayer de tout faire en une seule...; et puis à mettre ces étapes dans le bon ordre...

Il faut savoir relire son code et être un minimum logique.. sinon tu ne t'en sortiras pas...
0
Quelqu'un peut m'aider svp ?
0
Oui j'ai vu au final que ce n'était pas logique de mettre la variable à l'extérieur de la boucle...

J'ai essayé de le découper en deux étapes en utilisant une requête sql pour faire ma condition. En soit mon code paraît cohérent mais j'ai toujours un problème... Cette fois ci, j'ai tout le contenu qui est supprimé et aucun document récupéré lorsque je refais un ajout alors qu'il y a des fichiers existant à l'origine ...

C'est sûr c'est le gros problème que j'ai en ce moment, je maîtrise pas très bien la logique...

Voici l'intégralité de mon code qui a été modifié :
for($i=0; $i<=$total_ligne; $i++) 
{
   foreach ($result as $ligne) {
	  $value = $ligne['document_upl'];

    $SQL_img = "SELECT * FROM recrut.img WHERE img_nom LIKE '".$_GET['user_id']."-".$ligne['document_upl'].".%'";
		// echo $SQL_img;
		$req_img = $mysqli -> query ($SQL_img);
		$res_img = $req_img -> fetch_array();

      if ($res_img["img_nom"] == NULL)
      {

        $_FILES["tmp_name"]='./img_tmp/';

        // Recuperation des extensions
        $infosfichier[$i] = pathinfo($_FILES["upload$i"]['name']);
        $extension_upload[$i] = $infosfichier[$i]['extension'];

        // Upload fichiers dans img_tmp
        move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]); 

          $img_blob[$i]   = '';

          $img_nom[$i]  = $_GET["user_id"]."-".$value.".".$extension_upload[$i];  

          $img_blob[$i] = addslashes(file_get_contents("./img_tmp/".$img_nom[$i]));

          if ( !empty( $img_blob[$i] ) ) {
            // Insere l'image dans la BDD
            $requete = "REPLACE INTO recrut.img(img_id,img_nom,img_blob,img_date) VALUES (".$_GET['user_id'].",'".$img_nom[$i]."', '".$img_blob[$i]."', NOW());";

            // Envoie de la requête
            $result = $mysqli->query($requete) or die($requete . " " . $mysqli->error);
          }
        
      }
      else
      {
        array_map('unlink', glob("./img_tmp/".$_GET['user_id']."*"));

        $doc_exist[$i] = $res_img['img_blob'];

        // var_dump($doc_exist[$i]);

        $tmpFile[$i] = "./img_tmp/".$res_img['img_nom'];
        error_log($tmpFile[$i]);

        file_put_contents($tmpFile[$i], $doc_exist[$i]);

        $tmpFile[$i];

        $img_nom[$i] = $res_img['img_nom'];

        $img_blob[$i] = addslashes(file_get_contents($tmpFile[$i]));

        if ( !empty( $img_blob[$i] ) ) {
          // Insere l'image dans la BDD
          $requete = "REPLACE INTO recrut.img(img_id,img_nom,img_blob,img_date) VALUES (".$_GET['user_id'].",'".$img_nom[$i]."', '".$img_blob[$i]."', NOW());";

          // Envoie de la requête
          $result = $mysqli->query($requete) or die($requete . " " . $mysqli->error);
        }

      }

    $i++;
  }
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Après plusieurs phases de test, j'en suis venu à un soucis bien précis, celui de supprimer uniquement le fichier existant. Ma condition fonctionne par contre je ne parvient pas à faire en sorte que le unlink supprime qu'un fichier bien précis...

unlink("./img_tmp/".$nom_img);


C'est pourtant le bon chemin de mon répertoire. Après lorsque je fais un

var_dump($nom_img);


Cela me retourne :
string(51) "2-Attestation-Inscription-conseil-Departemental.jpg" string(20) "2-Carte-Identite.png" string(13) "2-Diplome.pdf" string(9) "2-RCP.png" string(9) "2-RIB.png"

Du coup j'ai l'impression que lorsque j'utilise ma variable il y a tout ça à la fois alors que je souhaiterai qu'il y ait qu'un seul nom...

Dois-je refaire une boucle pour que le "unlink" supprime un par un les fichiers concernés ?

Voici la dernière version de mon code :
for($i=0; $i<=$total_ligne; $i++) 
{
   foreach ($result as $ligne) {
	  $value = $ligne['document_upl'];

    $SQL_img = "SELECT * FROM recrut.img WHERE img_nom LIKE '".$_GET['user_id']."-".$ligne['document_upl'].".%'";
		// echo $SQL_img;
		$req_img = $mysqli -> query ($SQL_img);
		$res_img = $req_img -> fetch_array();

      if ($res_img["img_nom"] == NULL)
      {

        $_FILES["tmp_name"]='./img_tmp/';

        // Recuperation des extensions
        $infosfichier[$i] = pathinfo($_FILES["upload$i"]['name']);
        $extension_upload[$i] = $infosfichier[$i]['extension'];

        // Upload fichiers dans img_tmp
        move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]); 

          $img_blob[$i]   = '';

          $img_nom[$i]  = $_GET["user_id"]."-".$value.".".$extension_upload[$i];  

          $img_blob[$i] = addslashes(file_get_contents("./img_tmp/".$img_nom[$i]));

          if ( !empty( $img_blob[$i] ) ) {
            // Insere l'image dans la BDD
            $requete = "REPLACE INTO recrut.img(img_id,img_nom,img_blob,img_date) VALUES (".$_GET['user_id'].",'".$img_nom[$i]."', '".$img_blob[$i]."', NOW());";

            // Envoie de la requête
            $result = $mysqli->query($requete) or die($requete . " " . $mysqli->error);
          }
        
      }
      else
      {
        // array_map('unlink', glob("./img_tmp/".$_GET['user_id']."*"));

        foreach ($req_img as $ligne_img) {
	        $nom_img = $ligne_img['img_nom'];
          $blob_img = $ligne_img['img_blob'];

          $doc_exist[$i] = $blob_img;         

          $tmpFile[$i] = "./img_tmp/".$nom_img;
          error_log($tmpFile[$i]);

          file_put_contents($tmpFile[$i], $doc_exist[$i]);

          $tmpFile[$i];

          // Recuperation des extensions
          $infosfichier[$i] = pathinfo($_FILES["upload$i"]['name']);
          $extension_upload[$i] = $infosfichier[$i]['extension'];

          if ($tmpFile[$i] != "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i])
          {
            unlink("./img_tmp/".$nom_img);

            var_dump($nom_img);

            // Upload fichiers dans img_tmp
            move_uploaded_file($_FILES["upload$i"]['tmp_name'], "./img_tmp/".$_GET["user_id"]."-".$value.".".$extension_upload[$i]); 
          }


          // var_dump($tmpFile[$i]);

          $img_nom[$i] = $nom_img;

          $img_blob[$i] = addslashes(file_put_contents($tmpFile[$i], $doc_exist[$i]));

          if ( !empty( $img_blob[$i] ) ) {
            // Insere l'image dans la BDD
            $requete = "REPLACE INTO recrut.img(img_id,img_nom,img_blob,img_date) VALUES (".$_GET['user_id'].",'".$img_nom[$i]."', '".$img_blob[$i]."', NOW());";

            // Envoie de la requête
            $result = $mysqli->query($requete) or die($requete . " " . $mysqli->error);
          }
        }
      }

    $i++;
  }
}
0