Как удалить файл с помощью формы?

Я использую OctoberCMS на основе Laravel.

Я пытаюсь удалить файл. Я ввожу имя файла в текстовое поле и нажимаю отправить.

Форма компонента

<form method="POST" action="{{ url('/purge') }}">
    <input type="hidden" name="_handler" value="onPurge" />
    {{ form_token() }}
    {{ form_sessionKey() }}

    <input type="text" name="filename" /> 

    <input type="submit" name="submit" value="Purge" />  
</form>

Компонент PHP

public function onPurge(){
    $name = $_POST['filename'];

    if (!empty($_POST['submit'])) {
        $file->delete(storage_path("app/media/$name"));
    }
}

Ошибка

Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically

Я попытался

public function onPurge(){
    $name = $_POST['filename'];

    if (!empty($_POST['submit'])) {
        $file = new Video();
        $file->delete(storage_path("app/media/$name"));
    }
}

(также с полным путем /var/www/mysite/public/)

Функция завершается, ошибки нет, но файл не удаляется.


person Matt McManis    schedule 05.02.2017    source источник
comment
В качестве проблемы отладки я рекомендую вам сначала проверить, получаете ли вы файл, если он существует, с помощью File::exists(), если он существует, вы можете исправить свой собственный код как есть. P.S. измените свой путь на абсолютный $path = public_path()./storage/app/media/ что-то вроде этого или проверьте путь к файлу.   -  person Rahul    schedule 05.02.2017
comment
@rahul_m Я изменил путь к коду. Файл не удаляется, но я возвращаю true с помощью: if (File::exists(storage_path(app/media/$name))) { echo File Exists; }   -  person Matt McManis    schedule 05.02.2017
comment
хороший проход File::delete(storage_path(app/media/$name))); и попробуй один раз   -  person Rahul    schedule 05.02.2017
comment
и напишите юридический код, подобный этому, если он существует, удалите только файл, иначе пропустите часть   -  person Rahul    schedule 05.02.2017
comment
Попробуйте использовать \File::exists и то же самое для \File::delete.   -  person Rahul    schedule 05.02.2017
comment
@rahul_m Поправка, эхо говорит о том, что файл существует, даже если я указал неправильное имя файла. Если я вызову File::delete без использования $file-›delete, я получу ошибку Нестатический метод не должен вызываться статически.   -  person Matt McManis    schedule 05.02.2017
comment
Попробуйте использовать \File::exists и то же самое для \File::delete. Однажды я дал вам пример кода в своем ответе, попробуйте.   -  person Rahul    schedule 05.02.2017
comment
@rahul_m Косая черта сработала, теперь она удаляется. Спасибо!   -  person Matt McManis    schedule 05.02.2017


Ответы (2)


Ваша функция очистки должна выглядеть так:

public function onPurge(){
    $name = $_POST['filename'];
    $file_path = storage_path("app/media/$name");
    if(File::exists($file_path)){ // OR \File::exists($file_path)
     File::delete($file_path); // OR \File::delete($file_path)
    }
}

Я чувствую, что это должно сработать.

Попробуйте.

person Rahul    schedule 05.02.2017
comment
Пожалуйста, не рекомендуйте доступ напрямую к $_POST суперглобальным переменным, это усложняет проверку. - person OsDev; 06.02.2017
comment
Я знаю, приятель, я бы предпочел предложить переменную $request внутри каждого метода контроллера. Но я рассмотрел возможность ОП - person Rahul; 07.02.2017

Вместо этого вы можете использовать функцию unlink php.

if (!empty($_POST['submit'])) {
    $removed = unlink($path . $file);
}if(!$removed) {
   die('file could not be deleted');
}
person Sam Aldis    schedule 05.02.2017
comment
Я получаю сообщение об ошибке Вызов неопределенного метода October\Rain\Database\QueryBuilder::unlink() - person Matt McManis; 05.02.2017