PHP - Déplacer un fichier dans un dossier différent sur le serveur


186

Je dois autoriser les utilisateurs de mon site Web à supprimer leurs images du serveur après les avoir téléchargées s'ils ne les veulent plus. J'utilisais auparavant la unlinkfonction en PHP, mais on m'a dit depuis que cela peut être assez risqué et poser un problème de sécurité. (Code précédent ci-dessous :)

if(unlink($path.'image1.jpg')){ 
     // deleted
}

Au lieu de cela, je veux simplement déplacer le fichier dans un dossier différent. Cela doit pouvoir être fait longtemps après avoir téléchargé le fichier pour la première fois, donc à chaque fois qu'ils se connectent à leur compte. Si j'ai le dossier principal qui stocke les images des utilisateurs:

user/

puis dans ce dossier appelé del qui est la destination pour mettre leurs images indésirables:

user/del/

Existe-t-il une commande pour déplacer un fichier dans un autre dossier? Alors ça dit:

user/image1.jpg

se déplace vers / devient

user/del/image1.jpg

Réponses:


433

La renamefonction fait cela

docs renommer

rename('image1.jpg', 'del/image1.jpg');

Si vous souhaitez conserver le fichier existant au même endroit, vous devez utiliser copy

copie de documents

copy('image1.jpg', 'del/image1.jpg');

Si vous souhaitez déplacer un fichier téléchargé, utilisez le move_uploaded_file, bien que ce soit presque le même que renamecette fonction vérifie également que le fichier donné est un fichier qui a été téléchargé via le POST, cela empêche par exemple qu'un fichier local soit déplacé

docs move_uploaded_file

$uploads_dir = '/uploads';
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        $name = $_FILES["pictures"]["name"][$key];
        move_uploaded_file($tmp_name, "$uploads_dir/$name");
    }
}

extrait de code de la documentation


1
Un problème avec rename () et copy () est que vous avez perdu toutes les métadonnées telles que la date de création et de modification par exemple .. gardez cela à l'esprit.
Musikdoktor


18

Si vous souhaitez déplacer le fichier dans un nouveau chemin avec conserver le nom de fichier d'origine. utilisez ceci:

$source_file = 'foo/image.jpg';
$destination_path = 'bar/';
rename($source_file, $destination_path . pathinfo($source_file, PATHINFO_BASENAME));

A travaillé comme un charme.
ucMedia

2

J'utilise le shell pour lire tous les fichiers de données, puis les affecter au tableau. Ensuite, je déplace le fichier en position supérieure.

i=0 
for file in /home/*.gz; do
    $file
    arr[i]=$file
    i=$((i+1)) 
done 
mv -f "${arr[0]}" /var/www/html/

Veuillez expliquer cela plus en détail - comment cela pourrait-il fonctionner avec PHP?
Nico Haase

1

Une solution consiste d'abord à copier () le fichier (comme mentionné ci-dessus) et lorsque le fichier de destination existe - le fichier unlink () de la localisation précédente. De plus, vous pouvez valider la somme de contrôle MD5 avant de dissocier pour être sûr


1

Créez une fonction pour la déplacer:

function move_file($file, $to){
    $path_parts = pathinfo($file);
    $newplace   = "$to/{$path_parts['basename']}";
    if(rename($file, $newplace))
        return $newplace;
    return null;
}

0

utilisation copy () et unlink () fonction

$moveFile="path/filename";
if (copy($csvFile,$moveFile)) 
{
  unlink($csvFile);
}

-4

shell_exec ('mv filename dest_filename');


2
Bienvenue dans Stack Overflow! Bien que cet extrait de code puisse résoudre la question, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, cela réduit la lisibilité du code et des explications!
Filnor
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.