PHP - Verschieben Sie eine Datei in einen anderen Ordner auf dem Server


180

Ich muss Benutzern auf meiner Website erlauben, ihre Bilder vom Server zu löschen, nachdem sie sie hochgeladen haben, wenn sie sie nicht mehr möchten. Ich habe die unlinkFunktion zuvor in PHP verwendet, aber seitdem wurde mir gesagt, dass dies sehr riskant und ein Sicherheitsproblem sein kann. (Vorheriger Code unten :)

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

Stattdessen möchte ich jetzt einfach die Datei in einen anderen Ordner verschieben. Dies muss lange nach dem ersten Hochladen der Datei möglich sein, damit sie sich jedes Mal bei ihrem Konto anmelden können. Wenn ich den Hauptordner habe, in dem die Bilder des Benutzers gespeichert sind:

user/

und dann in diesem einen Ordner namens del, der das Ziel ist, um ihre unerwünschten Bilder zu platzieren:

user/del/

Gibt es einen Befehl zum Verschieben einer Datei in einen anderen Ordner? Das heißt also:

user/image1.jpg

bewegt sich zu / wird

user/del/image1.jpg

Antworten:


418

Die renameFunktion macht das

Dokumente umbenennen

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

Wenn Sie die vorhandene Datei an derselben Stelle behalten möchten, sollten Sie sie verwenden copy

docs kopieren

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

Wenn Sie eine hochgeladene Datei verschieben möchten, verwenden Sie die Option move_uploaded_file. Obwohl dies fast dieselbe renameFunktion ist, mit der diese Funktion auch überprüft, ob es sich bei der angegebenen Datei um eine Datei handelt, die über die Datei hochgeladen wurde POST, wird beispielsweise verhindert, dass eine lokale Datei verschoben wird

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

Code-Snipet aus Dokumenten


Ein Problem bei rename () und copy () ist, dass Sie alle Metadaten verloren haben, z. B. das Erstellungs- und Änderungsdatum.
Musikdoktor


17

Wenn Sie die Datei in einen neuen Pfad verschieben möchten, behalten Sie den ursprünglichen Dateinamen bei. benutze das:

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

Lief wie am Schnürchen.
ucMedia

1

Eine Lösung besteht darin, zuerst die Datei zu kopieren () (wie oben erwähnt) und wenn die Zieldatei vorhanden ist - die Verknüpfung der Datei () von der vorherigen Lokalisierung aufzuheben. Darüber hinaus können Sie die MD5-Prüfsumme überprüfen, bevor Sie die Verknüpfung aufheben, um sicherzugehen


1

Erstellen Sie eine Funktion, um sie zu verschieben:

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

1

Ich benutze Shell, lese alle Datendateien und weise sie dann dem Array zu. Dann verschiebe ich die Datei in die oberste Position.

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

Bitte erläutern Sie dies weiter - wie könnte dies mit PHP funktionieren?
Nico Haase

0

Verwendung copy () und unlink () Funktion

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

-4

shell_exec ('mv filename dest_filename');


2
Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage in Zukunft für Leser beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen. Dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen!
Filnor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.