2

您好,我已使用以下链接中的代码允许将图像上传到服务器。 Summernote 图片上传

如果用户从编辑器中删除图像,是否可以实现类似的东西从服务器中删除图像?如果是这样,我该如何实现这一目标?

4

4 回答 4

8

要从服务器中删除文件,您需要使用onMediaDelete,但使用情况因 Summernote 版本不同而异,有时在文档中很难找到。

夏季笔记 0.6.x

$(document).ready(function() {
    $('.summernote').summernote({
        height: "300px",
         onMediaDelete : function($target, editor, $editable) {
         alert($target.context.dataset.filename);         
         $target.remove();
    }
    });
});

夏季笔记 0.7.x

$(document).ready(function() {
    $('.summernote').summernote({
        height: "300px",
        onMediaDelete : function(target) {
                deleteFile(target[0].src);
            }

    });
});

对于 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:在检索 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';
        }
?>

在此处输入图像描述

这就是我使用的,只是删除事件不会像退格一样在按键上触发,也许将来会有一个 keyEvent 处理。

于 2017-11-08T14:21:39.297 回答
1

我想你现在已经解决了这个问题,但是我一直在寻找相同的答案并最终设法让它在这里工作,这是我的方法:

首先我得到了img srcsummernote中的所有文件,textarea然后我读取img了服务器上文件夹中的所有文件。之后,我unlink将文件夹中的文件不在summernote的img src数组中。

        $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));
               }
           }
       } 

希望这对其他人有帮助。

编辑回答@eachone:你也可以使用 AJAX(我用 jQuery 做)。

$('#DivContainingSummernoteTextarea').blur(function(){
$contentPost = $("#SummernoteTextarea").code();
doAjax('something');
});

我将 Summernote 的 textarea 的内容存储在$contentPost. 然后doAjax将调用 PHP 和 POST $content。如果img服务器上的 不在,$content它将被删除。

于 2015-08-24T16:34:15.583 回答
0

如果我们可以在客户端捕获用户删除图像操作的事件,我们可以进行 ajax 调用来删除图像。但我不知道是不是。我也在寻找解决方案。

于 2015-09-11T10:22:00.563 回答
0

在 Django 中,我使用正则表达式在原始 html 中查找 imgs 如果我要删除帖子,或者编辑后它有不同的 imgs,我将删除它们

from traceback import print_exc
import re
import os

def get_imgs(html):
    pat = re.compile(r'<img [^>]*src="([^"]+)')
    imgs = pat.findall(html)
    return imgs

def delete_imgs(imgs):
    if imgs:
        base = os.getcwd()
        for img in imgs:
            try:
                img_path = os.path.join(base, img[1:])
                if os.path.exists(img_path):
                    os.remove(img_path)
            except Exception as e:
                print_exc(e)
                print(imgs)
                print(img_path)
于 2020-07-04T17:55:45.050 回答