Удалить изображение вместе с путем к файлу

Долгое время я пытался удалить изображение из базы данных, а также путь к файлу. Нет проблем с загрузкой изображений. Мой контроллер:

 public function deleteFile()  {
if ($this->images_model->delete_file($user_id, $fileName))  {            
         $status = 'success';
         $msg = 'File successfully deleted';
    }else{
    $status = 'error';
    $msg = 'Something went wrong when deleting the file, please try again';
    }
   echo json_encode(array('status' => $status, 'msg' => $msg)); 

Модель Images_model следующая:

public function delete_file ($user_id, $fileName)  {        
    $this->db->where('user_id', $user_id);
    unlink("uploads/".$fileName);
    $this->db->delete('images', array('user_id' => $user_id));

}

Удалить изображение вместе с путем к файлу

Думаю, проблема может заключаться в моем коде для выполнения удаления. Вот представление, в котором я пытаюсь сделать что-то вроде следующего. «main» указывает на контроллер:

<input type = "image" id = "delete-profile-img" src = "<?= base_url('/assets/images/delete-icon-gray.png') ?>" title = "Delete Image" onclick = "'$this->main->deleteFile'" >

Можно ли использовать «onclick» при указании на функцию или мне нужно использовать более сложные java или ajax? Заранее спасибо за любой вклад.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

public function deleteFile($fileName)  { // SET THE FILE NAME AS PARAMETER
// Make sure to also set the variable $user_id here in some appropriate way 

  if ($this->images_model->delete_file($user_id, $fileName))  {            
      $status = 'success';
      $msg = 'File successfully deleted';
  }else{
      $status = 'error';
      $msg = 'Something went wrong when deleting the file, please try again';
  }
  echo json_encode(array('status' => $status, 'msg' => $msg)); 
}

А ссылка на удаление файла может быть простой ссылкой с именем файла в качестве параметра, который вы можете указать при отрисовке страницы:

<a href = "/deleteFile/<?=$filename?>">Delete</a>

Но я предполагаю из вашего кода, что вам нужна некоторая обработка AJAX через запрос GET или POST для обработки ответа JSON. То, как вы это настроите, зависит от того, какую библиотеку JavaScript или другой подход вы используете. Вам нужно написать функцию JavaScript для обработки запроса. Ссылка может быть примерно такой:

<input type = "image" id = "delete-profile-img" src = "<?= base_url('/assets/images/delete-icon-gray.png') ?>" title = "Delete Image" onclick = "delete(<?=$fielname?>)" >

И функция JavaScript может выглядеть примерно так, если вы используете Jquery:

function delete(filename){
   var url = '/deleteFile/'+ filename;
   $.get(url, function(obj) {
      //console.info(obj);
      // DO SOMETHING WITH THE RESPONSE HERE... 
    })
}

Извините, я был немного занят, но я все еще изучаю ваши предложения. Единственное, у меня нет отдельного файла для удаления. Я постараюсь сослаться на функцию.

dreamerdan 22.01.2019 17:31

Также я не слишком знаком с JS. Не могли бы вы сказать мне, что вы подразумеваете под //сделать что-то с ответом//. Похоже, это может сработать. Дам вам знать. Благодарить!

dreamerdan 22.01.2019 17:35

Это работает, но удаляет ВСЕ изображения для уважаемого пользователя. Я также получаю сообщение об ошибке, что путь оператора unlink не существует, когда я знаю, что он существует. Модель: публичная функция deleteFile ($user_id, $fileName) { $this->db->where('user_id', $user_id); unlink('uploads/'.$fileName); $this->db->delete('images', array('user_id' => $user_id)); Посмотрим, смогу ли я понять проблему. Спасибо.

dreamerdan 22.01.2019 22:32

«Что-то сделать с ответом», например, если вы хотите предупредить пользователя об удаленном файле с помощью Javascript. Вы должны изменить модель, чтобы удалить только файл, а не все файлы для пользователя. Что-то вроде: $this->db->where( array('user_id' => $user_id, 'filename' => $fileName)); В переводе на SQL: DELETE FROM table WHERE user_id = ? AND filename = ?

Michael Krikorev 24.01.2019 15:33

Я разместил еще один связанный вопрос об удалении изображения. Он по-прежнему удаляет ВСЕ изображения. У меня аналогичная проблема с копированием изображения на другой путь. Это говорит мне, что я должен найти способ присвоить переменную выбору пользователя. Если вы видите новый вопрос, вы должны получить информацию. Еще раз спасибо!

dreamerdan 24.01.2019 20:47

Я смог это исправить. Я разместил ответ на него, так что, надеюсь, кто-то еще может извлечь из этого пользу.

dreamerdan 25.01.2019 01:32

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

<a id = "delete-profile-img" class = "btn btn-danger btn-xs" href = "<?php echo base_url().'main/deleteFile/'."uploads/".$images->imageName ?>" title = "Delete">Delete</a>

Затем я добавил дополнительный код в КОНТРОЛЛЕР:

public function deleteFile($images, $imageName)  {                   
         $user_id = $this->session->userdata['user_id'];             
                $result = $this->db->get_where('images', array('user_id' => $user_id, 'imageName' => $imageName));         
         $rows = $result->result(); 
         foreach ($rows as $row) {
         unlink("uploads/".$imageName);             
         }             
         $this->images_model->deleteFile($user_id, $imageName); 
         redirect(site_url().'main/index');                         
      }

Модель:

public function deleteFile ($user_id, $imageName)  {              
    return $this->db->delete('images', array('user_id' => $user_id, 'imageName' => $imageName));        
    }   

Спасибо тем, кто предоставил ценные отзывы по этой теме. Надеюсь, это может помочь другим, которые пытаются сделать то же самое.

Другие вопросы по теме