PHP - bir dosyayı sunucudaki farklı bir klasöre taşıma


182

Web sitemdeki kullanıcıların, artık istemiyorlarsa yükledikten sonra görüntülerini sunucudan silmesine izin vermeliyim. Daha önce unlinkPHP işlevi kullanıyordum ama o zamandan beri bu oldukça riskli ve bir güvenlik sorunu olabileceği söylendi. (Önceki kod aşağıdadır :)

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

Bunun yerine şimdi dosyayı farklı bir klasöre taşımak istiyorum. Bu, dosyayı ilk yükledikten sonra, hesaplarına her giriş yaptıklarında uzun bir süre yapılabilmelidir. Eğer kullanıcı görüntü (ler) depolayan ana klasör varsa:

user/

ve sonra içinde istenmeyen görüntülerini koyma hedefi olan del adlı bir klasör:

user/del/

Bir dosyayı farklı bir klasöre taşıma komutu var mı? Demek ki:

user/image1.jpg

/ olur

user/del/image1.jpg

Yanıtlar:


421

renameİşlev yapar

dokümanlar yeniden adlandır

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

Mevcut dosyayı aynı yerde tutmak istiyorsanız, copy

dokümanlar kopyala

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

Yüklenen bir dosyayı taşımak istiyorsanız move_uploaded_file, renamebu işlevle hemen hemen aynı olsa da, verilen dosyanın üzerinden yüklenen bir dosya olup olmadığını da denetler POST, bu örneğin yerel bir dosyanın taşınmasını önler

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

dokümanlardaki kod pasajı


Rename () ve copy () ile ilgili bir sorun, oluşturulmuş ve değiştirilmiş tarih gibi tüm meta verileri kaybetmiş olmanızdır.
Musikdoktor


17

Dosyayı orijinal yol adını koruyarak yeni bir yola taşımak istiyorsanız. bunu kullan:

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

Bir cazibe gibi çalıştı.
ucMedia

1

Bazı çözümler önce (yukarıda belirtildiği gibi) dosyayı kopyalamak () ve hedef dosya mevcut olduğunda - önceki yerelleştirmeden dosyanın bağlantısını kaldırın (). Ek olarak, bağlantıyı kesmeden önce MD5 sağlama toplamını doğrulayabilirsiniz.


1

Taşımak için bir işlev oluşturun:

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

1

Ben kabuk kullanarak tüm veri dosyasını okumak sonra diziye atar. Sonra dosyayı en üst konuma getiriyorum.

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

Lütfen daha fazla açıklayın - bu PHP kullanarak nasıl çalışabilir?
Nico Haase

0

Kullanım kopyası () ve unlink () fonksiyonu

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

-4

shell_exec ('mv dosya adı dest_filename');


2
Stack Overflow'a hoş geldiniz! Bu kod snippet'i soruyu çözebilir, ancak bir açıklama da dahil olmak üzere , yayınınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
Filnor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.