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

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


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


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

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


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

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/

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

-4

shell_exec ('mv filename dest_filename');


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.