PHP - переміщення файлу в іншу папку на сервері


182

Мені потрібно дозволити користувачам на моєму веб-сайті видаляти їх зображення з сервера після завантаження, якщо вони більше не хочуть їх. Раніше я використовував цю unlinkфункцію в PHP, але з тих пір мені сказали, що це може бути досить ризиковано і проблемою безпеки. (Попередній код нижче :)

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

Натомість я зараз хочу просто перемістити файл у іншу папку. Це потрібно зробити протягом тривалого часу після першого завантаження файлу, щоб у будь-який час вони увійшли до свого облікового запису. Якщо у мене є основна папка, яка зберігає зображення (и) користувачів:

user/

а потім у цій папці під назвою del, яка є пунктом призначення, щоб розмістити свої небажані зображення:

user/del/

Чи є команда перемістити файл в іншу папку? Так що кажуть:

user/image1.jpg

рухається до / стає

user/del/image1.jpg

Відповіді:


421

renameФункція робить це

Документи перейменувати

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

Якщо ви хочете зберегти існуючий файл на тому самому місці, яке вам слід використовувати copy

копіювати документи

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

Якщо ви хочете перемістити завантажений файл, використовуйте move_uploaded_file, хоча це майже те саме, що renameця функція також перевіряє, що даний файл є файлом, який було завантажено через POST, це запобігає, наприклад, переміщення локального файлу

документи 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");
    }
}

фрагмент коду від документів


Одна з проблем із перейменуванням () та копією () полягає в тому, що ви втратили всі метадані, такі як створена та змінена дата, наприклад .. майте це на увазі.
Musikdoktor


17

Якщо ви хочете перемістити файл у новий шлях із збереженням оригінального імені файлу. використовуй це:

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

Працював як шарм.
ucMedia

1

Деяке рішення спочатку скопіювати () файл (як згадувалося вище), а коли існує цільовий файл - від’єднати () файл з попередньої локалізації. Крім того, ви можете перевірити контрольну суму MD5 перед від’єднанням, щоб бути впевненим


1

Створіть функцію для переміщення:

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

1

Я використовую оболонку, прочитавши весь файл даних, а потім призначу масиву. Потім я переміщу файл у верхнє положення.

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

Будь ласка, поясніть це далі - як це могло працювати за допомогою PHP?
Ніко Хааз


-4

shell_exec ('mv ім'я файлу dest_filename');


2
Ласкаво просимо до переповнення стека! Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, і ці люди можуть не знати причини вашої пропозиції щодо коду. Будь ласка, намагайтеся не переповнювати свій код пояснювальними коментарями, це зменшує читабельність і коду, і пояснень!
Фільнор
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.