Как удалить файл через PHP?

174

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

Вот мой макет страницы:

  • projects/backend/removeProjectData.php (этот файл удаляет все мои записи для базы данных, а также должен удалить связанный файл)
  • public_files/22.pdf (место, где находится файл.)

Я использую unlinkфункцию:

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

Но это всегда дает мне ошибку, что файл не существует. Любые идеи?

кругозор
источник
2
<pre> Использовать абсолютный путь </ pre>
Pavunkumar
1
если вы не проверяете, используя реальный путь, вы, скорее всего, получите «.» и ".." тоже не файлы, в результате чего в файле не существует ошибок
DrogoNevets
1
Но будьте осторожны, это не может действительно удалить ваш файл, если ваш файл имеет несколько имен файлов / символических ссылок! См. Эту тему для получения дополнительной информации: stackoverflow.com/q/17548906/1114320
Sliq

Ответы:

229

Следующее должно помочь

  • realpath - возвращает канонизированный абсолютный путь
  • is_writable - Сообщает, можно ли записать имя файла
  • unlink - удаляет файл

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

Гордон
источник
7
Интересно, как это делает w3shools? w3schools.com/php/func_filesystem_delete.asp
Fr0zenFyr
3
@ Гордон, мне жаль .. я использовал термин неправильно, что имеет большое значение .. я согласен, что это был идиотизм ... но то, что я пытался сказать, это пример кодирования, было бы более полезно ... если мне нужно посетить три другие ссылки чтобы понять ваш ответ, это очень полезно? ... извините за неправильное слово ... я не из англоговорящей страны ... хотя это не может быть оправданием ...
Ритабрата Гаутам
13
@RitabrataGautam "если мне нужно посетить три другие ссылки, чтобы понять ваш ответ, это очень полезно?" - Да, это так. Потому что после перехода по ссылкам вы поймете, как это работает. Если я просто дам вам коды, вы не поймете, а просто скопируете и вставите. Что вы тогда узнали? Ничего. Кроме того, код для этого очень тривиален.
Гордон
1
@ Гордон .. я согласен .. ваши взгляды требуют уважения .. вы заработали # 185K ... всего два коротких вопроса ... 1> если я считаю ваш ответ завершенным, то почему многие модераторы здесь говорят, что вы должны также предоставить некоторый код ... не просто ссылки (это вызывает много отрицательных голосов) ... 2> не было бы лучше, если бы вы поместили некоторый код. теперь, у кого есть склонность к обучению, они обязательно посетят эти ссылки, а у кого нет, они снова пойдут в Google, чтобы получить готовый код.
Ритабрата Гаутам
2
ответ показался мне достаточно простым: но пример кода, который вы хотели: $ path = realpath ('../../ public_files /'. $ fileName); if (is_writable ($ path)) {unlink ($ path);}
me_
103
$files = [
    './first.jpg',
    './second.jpg',
    './third.jpg'
];

foreach ($files as $file) {
    if (file_exists($file)) {
        unlink($file);
    } else {
        // File not found.
    }
}
Ubique
источник
11
проголосовал за использование file_existsфункции. В противном случае вы получите ошибку, если файл не существует.
Махди
17

Прежде всего, проверьте свои права доступа к файлу, чтобы убедиться, что вы можете: а) увидеть его в своем скрипте и б) иметь возможность удалить его.

Вы также можете использовать путь, рассчитанный из каталога, в котором вы в настоящий момент запускаете скрипт, например:

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

(в PHP 5.3 я думаю, что вы можете использовать __DIR__константу вместо, dirname()но я сам еще не использовал ее)

richsage
источник
Я проверил разрешения и сначала не смог увидеть файл, но теперь все работает благодаря 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качестве имени для своей функции.
Рехам Фахми
Если это открытая статическая функция в классе, unlink является допустимым именем функции: 3v4l.org/MgA2l
nadar
Да, но в текущем сценарии Standalone - лучший выбор.
Джунаид Атари
1

Я знаю, что этот вопрос немного устарел, но это нечто простое, что очень хорошо работает для меня, удаляя изображения из моего проекта, над которым я работаю.

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

В dirname(__FILE__)разделе выводится базовый путь к вашему проекту. Это /img/tasks/две папки ниже моего основного пути. И, наконец, я хочу удалить мое изображение, которое вы можете превратить во что угодно.

При этом у меня не было проблем с получением файлов на моем сервере и их удалением.

abetwothree
источник