PHP - Przenieś plik do innego folderu na serwerze

181

Muszę zezwolić użytkownikom mojej witryny na usunięcie ich zdjęć z serwera po ich przesłaniu, jeśli nie będą ich już chcieli. Wcześniej korzystałem z tej unlinkfunkcji w PHP, ale powiedziano mi, że może to być dość ryzykowne i problem z bezpieczeństwem. (Poprzedni kod poniżej :)

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

Zamiast tego chcę teraz po prostu przenieść plik do innego folderu. Musi to być możliwe długo po pierwszym przesłaniu pliku, aby za każdym razem logowali się na swoje konto. Jeśli mam główny folder, w którym przechowywane są obrazy użytkowników:

user/

a następnie w tym folderze o nazwie del, który jest miejscem docelowym do umieszczenia niechcianych obrazów:

user/del/

Czy istnieje polecenie przeniesienia pliku do innego folderu? To powie:

user/image1.jpg

przesuwa się do / staje się

user/del/image1.jpg
Dziwna kaczka
źródło

Odpowiedzi:

420

renameFunkcja robi to

zmiana nazwy dokumentów

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

Jeśli chcesz zachować istniejący plik w tym samym miejscu, którego powinieneś użyć copy

kopia dokumentów

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

Jeśli chcesz przenieść przesłany plik, użyj tego move_uploaded_file, chociaż jest to prawie to samo, ponieważ renameta funkcja sprawdza również, czy dany plik jest plikiem przesłanym za pośrednictwem POST, zapobiega to na przykład przeniesieniu pliku lokalnego

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

fragment kodu z dokumentów

MKroeders
źródło
Jednym z problemów z rename () i copy () jest to, że straciłeś wszystkie metadane, takie jak na przykład data utworzenia i modyfikacji. Miej to na uwadze.
Musikdoktor
95

Użyj funkcji rename () .

rename("user/image1.jpg", "user/del/image1.jpg");
Ben Fortune
źródło
17

Jeśli chcesz przenieść plik w nowej ścieżce, zachowaj oryginalną nazwę pliku. Użyj tego:

$source_file = 'foo/image.jpg';
$destination_path = 'bar/';
rename($source_file, $destination_path . pathinfo($source_file, PATHINFO_BASENAME));
Nabi KAZ
źródło
Działa jak urok.
ucMedia
1

Pewnym rozwiązaniem jest najpierw skopiowanie () pliku (jak wspomniano powyżej), a gdy istnieje plik docelowy - plik unlink () z poprzedniej lokalizacji. Ponadto, aby się upewnić, możesz sprawdzić sumę kontrolną MD5 przed odłączeniem

kwarty
źródło
1

Utwórz funkcję, aby ją przenieść:

function move_file($file, $to){
    $path_parts = pathinfo($file);
    $newplace   = "$to/{$path_parts['basename']}";
    if(rename($file, $newplace))
        return $newplace;
    return null;
}
Marcelo
źródło
1

Korzystam z powłoki, aby odczytać cały plik danych, a następnie przypisać do tablicy. Następnie przenoszę plik na najwyższą pozycję.

i=0 
for file in /home/*.gz; do
    $file
    arr[i]=$file
    i=$((i+1)) 
done 
mv -f "${arr[0]}" /var/www/html/
To Quoc Diep
źródło
Wyjaśnij to dalej - jak to może działać przy użyciu PHP?
Nico Haase
0

użycie kopii () i odłączenie () funkcja

$moveFile="path/filename";
if (copy($csvFile,$moveFile)) 
{
  unlink($csvFile);
}
Arunprabakaran M
źródło
-4

shell_exec ('mv filename dest_filename');

użytkownik10395079
źródło
2
Witamy w Stack Overflow! Ten fragment kodu może rozwiązać pytanie, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że w przyszłości odpowiadasz na pytanie czytelników, a ci ludzie mogą nie znać przyczyn Twojej sugestii kodu. Staraj się również nie tłoczyć kodu objaśniającymi komentarzami, co zmniejsza czytelność zarówno kodu, jak i objaśnień!
Filnor