Як видалити файл через PHP?


174

Як видалити файл з мого сервера за допомогою PHP, якщо файл знаходиться в іншому каталозі?

Ось моя макет сторінки:

  • projects/backend/removeProjectData.php (цей файл видаляє всі мої записи для бази даних, а також повинен видалити пов'язаний файл)
  • public_files/22.pdf (місце, де знаходиться файл.)

Я використовую unlinkфункцію:

unlink('../../public_files/' . $fileName);

Але це завжди дає мені помилку, що файл не існує. Будь-які ідеї?


2
<pre> Використовуйте абсолютний шлях </pre>
Павункумар

1
якщо ви не перевірите, використовуючи реальний шлях, ви, ймовірно, отримаєте "". і ".." не-файли теж, тому що у файлі не існує помилок
DrogoNevets

1
Але будьте обережні, це може не справді видалити ваш файл, якщо ваш файл має кілька імен файлів / символьних посилань! Дивіться цю тему для отримання додаткової інформації: stackoverflow.com/q/17548906/1114320
SliQ

Відповіді:


228

Наступне має допомогти

  • realpath - Повертає канонізовану абсолютну назву шляху
  • is_writable - Повідомляє, чи ім'я файлу підлягає запису
  • unlink - Видаляє файл

Запустіть ваш файловий шлях через realpath, потім перевірте, чи повертається шлях, що записується, і якщо так, від'єднайте його.


7
Цікаво, як це роблять w3shools? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr

3
@ Gordon мені шкода .. Я використав термін неправильно, що робить велику різницю ... я згоден, це було ідіотично .. але те, що я намагався мати на увазі, є прикладом кодування, було б корисніше .. якщо мені потрібно відвідати три інші посилання щоб зрозуміти вашу відповідь, чи дуже корисно це? ..сбажіть знову за неправильне слово .. Я не з країни, що говорить англійською мовою ... хоча це не може бути виправданням ...
Ritabrata Gautam

13
@RitabrataGautam "Якщо мені потрібно відвідати три інші посилання, щоб зрозуміти вашу відповідь, чи дуже корисно це?" - Так. Тому що перейшовши на посилання, ви зрозуміли, як це працює. Якщо я просто дам вам коди, ви не зрозумієте, а просто скопіюйте та вставте. Чого ви тоді дізналися? Нічого. Крім того, код для цього дуже тривіальний.
Гордон

1
@ Gordon .. я згоден .. ваші погляди вимагають поваги .. ви заробили це # 185K .. лише два швидких питання ... 1> якщо я вважаю вашу відповідь повною, то чому багато модераторів тут говорять, що вам слід також надати якийсь код ... не тільки посилання (це спричиняє багато голосів) ... 2> чи не було б краще, якщо ти покладеш якийсь код. Тепер у кого є тенденція до навчання, вони неодмінно відвідають ці посилання, а хто не має, вони знову перейдуть до Google, щоб отримати готовий код.
Ритабрата Гаутам

2
відповідь мені здавалася достатньо прямою: але приклад коду, який ви хотіли: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_

102
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}

11
голосування за використання file_existsфункції. Інакше ви отримаєте помилку, якщо файл не існує.
Махді

17

Перевірте свої дозволи перш за все у файлі, щоб переконатися, що ви можете: а) бачити його зі свого сценарію та б) чи зможете його видалити.

Ви також можете використовувати шлях, обчислений з каталогу, в якому зараз виконується сценарій, наприклад:

unlink(dirname(__FILE__) . "/../../public_files/" . $filename);

(В PHP 5.3 я вважаю, що ви можете використовувати __DIR__константу замість, dirname()але я ще не використовував її)


Я перевірив дозволи, і спочатку я не зміг побачити файл, але тепер усе працює завдяки realpath. дякую за пораду
Кен-

7

Ви можете видалити файл за допомогою

unlink($Your_file_path);

але якщо ви видаляєте файл із http-шляху, це від’єднання не працює належним чином. Ви повинні правильно вказати шлях до файлу.


4

Рішення AIO, обробляє все, це не моя робота, але я просто вдосконалювався. Насолоджуйтесь!

/**
 * Unlink a file, which handles symlinks.
 * @see https://github.com/luyadev/luya/blob/master/core/helpers/FileHelper.php
 * @param string $filename The file path to the file to delete.
 * @return boolean Whether the file has been removed or not.
 */
function unlinkFile ( $filename ) {
    // try to force symlinks
    if ( is_link ($filename) ) {
        $sym = @readlink ($filename);
        if ( $sym ) {
            return is_writable ($filename) && @unlink ($filename);
        }
    }

    // try to use real path
    if ( realpath ($filename) && realpath ($filename) !== $filename ) {
        return is_writable ($filename) && @unlink (realpath ($filename));
    }

    // default unlink
    return is_writable ($filename) && @unlink ($filename);
}

виглядає ідеально, велике спасибі, але будь ласка, оновіть його, оскільки ви не можете використовувати unlinkяк ім'я для своєї функції.
Рехам Фахмі

Якщо його загальнодоступна статична функція в класі, від’єднання - це дійсна назва функції: 3v4l.org/MgA2l
nadar

Так, але в нинішньому сценарії, Автономний - кращий вибір.
Джунаїд Атарі

1

Я знаю, що це питання трохи старе, але це щось просте, що дуже добре працює для видалення зображень з мого проекту, над яким я працюю.

unlink(dirname(__FILE__) . "/img/tasks/" . 'image.jpg');

У dirname(__FILE__)розділі виводиться базовий шлях до вашого проекту. Це /img/tasks/дві папки вниз від мого базового шляху. І нарешті, є мій образ, який я хочу видалити, який ви можете перетворити на все, що вам потрібно.

З цим у мене не виникло жодних проблем із потраплянням до моїх файлів на моєму сервері та їх видаленням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.