Привет, я использовал код из следующей ссылки, чтобы разрешить загрузку изображений на сервер. Загрузка изображения Summernote
Можно ли реализовать что-то подобное, чтобы удалить изображение с сервера, если пользователь удалит его из редактора? Если да, то как я могу добиться этого?
Наверное, вы решили проблему до сих пор, но поскольку я искал тот же ответ и, наконец, сумел заставить его работать, это мой подход:
Сначала я получаю все img src
в textarea
summernote, затем я читаю все файлы img
в папке на сервере. После этого я unlink
файлы в папке, которые не находятся в массиве img src summernote.
$dom = new domDocument; $dom->loadHTML(html_entity_decode($content)); $dom->preserveWhiteSpace = false; $imgs = $dom->getElementsByTagName("img"); $links = array(); $path = '../content/'.$id.'/'; $files = glob($path . "*.*"); for($i = 0; $i < $imgs->length; $i++) { $links[] = $imgs->item($i)->getAttribute("src"); } $result=array_diff($files, $links); foreach($result as $deleteFile) { if (file_exists($deleteFile)) { array_map('unlink', glob($deleteFile)); } } }
Надеюсь, это поможет другим.
EDIT, чтобы ответить на @ehotone: вы можете использовать AJAX тоже (я делаю это с jQuery).
$('#DivContainingSummernoteTextarea').blur(function(){ $contentPost = $("#SummernoteTextarea").code(); doAjax('something'); });
-$('#DivContainingSummernoteTextarea').blur(function(){ $contentPost = $("#SummernoteTextarea").code(); doAjax('something'); });
Я храню содержимое текстовой области summernote в $contentPost
. Затем doAjax
вызовет $content
PHP и POST $content
. Если img
на сервере не находится в $content
он будет удален.
Если мы сможем поймать событие для удаления пользователем действия с изображением на стороне клиента, мы можем сделать ajax-вызов для удаления изображения. но я не знаю, есть это или нет. Я также ищу решение.
Чтобы удалить файл формы сервера, вам необходимо использовать onMediaDelete
но использование зависит от разных версий summernote, которые иногда трудно найти в документах.
FOR SUMMERNOTE 0.6.x
$(document).ready(function() { $('.summernote').summernote({ height: "300px", onMediaDelete : function($target, editor, $editable) { alert($target.context.dataset.filename); $target.remove(); } }); });
FOR SUMMERNOTE 0.7.x
$(document).ready(function() { $('.summernote').summernote({ height: "300px", onMediaDelete : function(target) { deleteFile(target[0].src); } }); });
FOR SUMMERNOTE 0.8.x (Использовать обратные вызовы)
$(document).ready(function() { $('#summernote').summernote({ height: "300px", callbacks: { onImageUpload: function(files) { uploadFile(files[0]); }, onMediaDelete : function(target) { // alert(target[0].src) deleteFile(target[0].src); } } }); });
Javascript: пример удаления файла с помощью img src
function deleteFile(src) { $.ajax({ data: {src : src}, type: "POST", url: base_url+"dropzone/delete_file", // replace with your url cache: false, success: function(resp) { console.log(resp); } }); }
PHP: пример удаления изображения afeter, возвращающего img src
<?php $src = $this->input->post('src'); // $src = $_POST['src']; $file_name = str_replace(base_url(), '', $src); // striping host to get relative path if(unlink($file_name)) { echo 'File Delete Successfully'; } ?>
Это то, что я использовал, именно так, событие delete не запускается при нажатии клавиши, как backspace, возможно, keyEvent будет обрабатывать это в будущем.