PHP: sposta un file in un'altra cartella sul server


182

Devo consentire agli utenti sul mio sito Web di eliminare le loro immagini dal server dopo averle caricate se non le vogliono più. In precedenza utilizzavo la unlinkfunzione in PHP ma da allora mi è stato detto che questo può essere abbastanza rischioso e un problema di sicurezza. (Codice precedente sotto :)

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

Invece ora voglio semplicemente spostare il file in una cartella diversa. Questo deve poter essere eseguito a lungo dopo aver caricato il file per la prima volta, quindi ogni volta che accedono al proprio account. Se ho la cartella principale in cui sono memorizzate le immagini degli utenti:

user/

e poi all'interno di quella cartella chiamata del che è la destinazione per mettere le loro immagini indesiderate:

user/del/

Esiste un comando per spostare un file in una cartella diversa? Quindi quello dice:

user/image1.jpg

si sposta in / diventa

user/del/image1.jpg

Risposte:


421

La renamefunzione fa questo

rinominare i documenti

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

Se vuoi conservare il file esistente nello stesso posto dovresti usare copy

copia dei documenti

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

Se si desidera spostare un file caricato, utilizzare il move_uploaded_file, sebbene questo sia quasi lo stesso di renamequesta funzione controlla anche che il file dato sia un file che è stato caricato tramite il POST, questo impedisce ad esempio che un file locale venga spostato

documenti 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");
    }
}

codice snipet da documenti


Un problema con rename () e copy () è che hai perso tutti i metadati come ad esempio la data di creazione e modifica .. tienilo a mente.
Musikdoktor,


17

Se si desidera spostare il file nel nuovo percorso con Mantieni nome file originale. Usa questo:

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

Ha funzionato come un fascino.
ucMedia,

1

Qualche soluzione è prima di copiare () il file (come menzionato sopra) e quando esiste il file di destinazione - scollegare il file () dalla localizzazione precedente. Inoltre, puoi convalidare il checksum MD5 prima di scollegare per essere sicuro


1

Crea una funzione per spostarla:

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

1

Utilizzando la shell ho letto tutti i file di dati, quindi li ho assegnati all'array. Quindi sposto il file nella posizione più alta.

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

Per favore, spiegalo ulteriormente: come potrebbe funzionare con PHP?
Nico Haase,

0

uso copy () e unlink () funzione

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

-4

shell_exec ('mv nomefile nome_file');


2
Benvenuto in Stack Overflow! Mentre questo frammento di codice può risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non aggiungere il tuo codice a commenti esplicativi, ciò riduce la leggibilità sia del codice che delle spiegazioni!
Filnor,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.