Summernote 图像上传在 codeigniter 中不起作用

Posted

技术标签:

【中文标题】Summernote 图像上传在 codeigniter 中不起作用【英文标题】:Summernote image upload not working in codeigniter 【发布时间】:2017-08-21 05:18:15 【问题描述】:

我已经在我的网站中集成了 Summernote(使用 Codeigniter 构建)并且对于文本来说它工作正常。但是对于图片上传,就会出现以下问题。

Summernote 将图像读取为 base64。现在这对于小图像效果很好,但是一旦图像很大,由于数据库中 base64 创建的巨大字符串,图像最终不会呈现。

所以我试图将图像保存在我的服务器中,然后使用该图像的链接。

以下是代码: Summernote 的脚本:

<script type="text/javascript">
$(document).ready(function() 
  $('#summernote').summernote(
    height: 300,
    onImageUpload: function(files) 
            sendFile(files[0]);
        
  );
  function sendFile(file) 
        data = new FormData();
        data.append("files", file);
        upload_url = "<?php echo base_url(); ?>" + "general/upload_image";
        $.ajax(
            data: data,
            type: "POST",
            url: upload_url,
            cache: false,
            contentType: false,
            processData: false,
            success: function(url) 
                 $(this).summernote("insertImage", url);

            
        );
    
);

php upload_image 函数:

public function upload_image()

    if ($_FILES['file']['name']) 
        if (!$_FILES['file']['error']) 
            $name = md5(rand(100, 200));
            $ext = explode('.', $_FILES['file']['name']);
            $filename = $name . '.' . $ext[1];
            $destination = 'http://sitename.com/dist/img/blogimg/' . $filename; //change this directory
            $location = $_FILES["file"]["tmp_name"];
            move_uploaded_file($location, $destination);
            echo 'http://sitename.com/dist/img/blogimg/' . $filename;//change this URL
        
        else
        
            echo  $message = 'Ooops!  Your upload triggered the following error:  '.$_FILES['file']['error'];
        
    

现在,当我在summernote中单击插入图像或拖放图像时,控制台中会显示以下错误的多个实例:

>Uncaught TypeError: Cannot read property 'nodeType' of undefined

这就是我想要实现的, 注:此编辑器用于博客。 1. 用户点击插入图片并从他的电脑上传一张图片。 2. 图片在编辑器中显示(但在这一步没有上传到服务器)。 3. 当用户点击提交按钮时,图像应保存为预定义文件夹中的图像文件。 4.当页面呈现时它应该有

<img src="mysite.com/path_to_image"> 

现在是这样的

<img src="data:image/jpeg;base64,/9j/4AAQSkZJR....">)

请注意,我尝试在回调中使用 onImageUpload,但结果实际上没有发生任何事情,图像既没有上传到编辑器,也没有上传到服务器中的文件夹。

我哪里错了......??请帮我解决这个问题...

【问题讨论】:

只是一个建议codeigniter有自己的上传库codeigniter.com/user_guide/libraries/file_uploading.html 您最初的 base 64 大小问题可以通过更改为 LongText 来解决 @wolfgang1983 应该在upload_image() 函数中使用上传库对吗?您能否提供一个示例代码来展示如何使用此上传库处理 POST 数据。 ??我没看清楚…… 【参考方案1】:

您可以将其添加到您的存储/更新控制器。 它将在您的编辑器中检测图像,将其转换并保存在您的服务器中。

 $body = $data['content'];
        $doc = new DomDocument;
        libxml_use_internal_errors(true);
        $doc->loadHTML($body);      
        $images =  $doc->getelementsbytagname('img');
        define('UPLOAD_DIR', 'assets/images/announcement_img/');

        foreach($images as $k => $img)
            $datas = $img->getattribute('src');

            if (strpos($datas, 'data:image')!==false)
            list($type, $datas) = explode(';', $datas);
            list($media, $format) = explode('/', $type);
            list(, $datas)      = explode(',', $datas);
            $datas = str_replace(' ', '+', $datas);
            $datas = base64_decode($datas);

            $file= UPLOAD_DIR . time().$k.'.'.$format;
            $success = file_put_contents($file, $datas);
            print $success ? $file : '<br><br>Unable to save the file.<br><br>';

            $img->removeattribute('src');
            $img->setattribute('src',base_url().$file);
            
        

          
        $body = $doc->savehtml();
        $data['content']=$body;

【讨论】:

【参考方案2】:

好的,虽然我找不到解决问题的方法,但我已经实施了一个替代解决方案,它运行良好,尽管 pt. 3 不满足,图像在较早的步骤中上传到服务器。这也可以通过一些 js 脚本来满足...稍后会这样做...我所做的是针对 Summernote id 和类并添加我的代码来代替他们的...

    我通过以下代码删除了他们的上传图片字段:

<style>
/*to disable the upload image from computer uncomment this css code.*/
	.note-group-select-from-files 
  display: none;


</style>

接下来我以这种方式将我的 HTML 插入到他们的插入链接字段下方:

document.getElementsByClassName('note-group-image-url')[0].insertAdjacentHTML('afterend','&lt;p class="sober"&gt;&lt;a href="#" data-toggle="modal" data-target="#imageModal"&gt;&lt;p&gt;Click here to upoad image&lt;/p&gt;&lt;/i&gt;&lt;/a&gt;&lt;/p&gt;');

接下来我通过一个modal处理了图片上传,并编写了一个自定义的js脚本,将图片url复制到.note-image-url的字段中

另外我还得用js自定义summernote的插入图片按钮的javascript,这样用户就可以直接点击插入图片了。

【讨论】:

【参考方案3】:

如果你的 Summernote 版本在 0.7 之后

按照这个

$('#summernote').summernote(
                height: 400,
                callbacks: 
                    onImageUpload: function(files, editor, welEditable) 
                        sendFile(files[0]);
                     
                );

【讨论】:

以上是关于Summernote 图像上传在 codeigniter 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Summernote 显示已上传到文件夹的图像

带有 Summernote 的 CodeIgniter - 无法将图像上传到数据库

summernote vue html编辑器不会将图像上传到服务器

使用 Summernote 将图像上传到 Azure Blob

在summernote上插入图像后调整图像大小

在summernote上传的图片之间插入br标签