资讯专栏INFORMATION COLUMN

Editor.md和markdown实现Sg一样的截图粘贴上传

jollywing / 1830人阅读

暂时我还没有把这个做成一个插件,只是简单的几行代码。其中原理就是通过截图后,ev.clipboardData 包含了text和图片文件 数据

原文链接:http://blog.oeynet.com/post/7...

1.Js监听paste事件
seajs.use(["editormd"], function (editormd) {
            var editor = editormd({
                id: "post_content",
                height: 840,
                path: "/static/libs/editor.md/lib/",
                toolbarIcons: function () {
                    // Or return editormd.toolbarModes[name]; // full, simple, mini
                    // Using "||" set icons align right.
                    return ["undo", "redo", "|", "bold", "hr", "|", "preview", "watch", "|", "fullscreen", "info", "testIcon", "testIcon2", "file", "faicon", "||", "watch", "fullscreen", "preview", "testIcon"]
                },
                //toolbar  : false,             // 关闭工具栏
                codeFold: true,
                searchReplace: true,
                saveHTMLToTextarea: true,      // 保存 HTML 到 Textarea
                htmlDecode: "style,script,iframe|on*",            // 开启 HTML 标签解析,为了安全性,默认不开启
                emoji: true,
                taskList: true,
                tocm: true,          // Using [TOCM]
                tex: true,                      // 开启科学公式 TeX 语言支持,默认关闭
                //previewCodeHighlight : false,  // 关闭预览窗口的代码高亮,默认开启
                flowChart: true,                // 疑似 Sea.js与 Raphael.js 有冲突,必须先加载 Raphael.js ,Editor.md 才能在 Sea.js 下正常进行;
                sequenceDiagram: true,          // 同上
                //dialogLockScreen : false,      // 设置弹出层对话框不锁屏,全局通用,默认为 true
                //dialogShowMask : false,     // 设置弹出层对话框显示透明遮罩层,全局通用,默认为 true
                //dialogDraggable : false,    // 设置弹出层对话框不可拖动,全局通用,默认为 true
                //dialogMaskOpacity : 0.4,    // 设置透明遮罩层的透明度,全局通用,默认值为 0.1
                //dialogMaskBgColor : "#000", // 设置透明遮罩层的背景颜色,全局通用,默认为 #fff
                imageUpload: true,
                imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp"],
                imageUploadURL: "{:url("api/uploader/uploadEditorImg?pic_type=10")}",
                onload: function () {
                    this.on("paste", function () {
                        console.log(1);
                    });
                }
            });


            /**
             * 咱贴上传图片
             */
            $("#post_content").on("paste", function (ev) {
                var data = ev.clipboardData;
                var items = (event.clipboardData || event.originalEvent.clipboardData).items;
                for (var index in items) {
                    var item = items[index];
                    if (item.kind === "file") {
                        var blob = item.getAsFile();
                        var reader = new FileReader();
                        reader.onload = function (event) {
                            var base64 = event.target.result;
                            //ajax上传图片
                            $.post("{:url("api/uploader/upEditorImg")}",{base:base64}, function (ret) {
                                layer.msg(ret.msg);
                                if (ret.code === 1) {
                                    //新一行的图片显示
                                    editor.insertValue("
![" + ret.data.title + "](" + ret.data.path + ")");
                                }
                            });
                        }; // data url!
                        var url = reader.readAsDataURL(blob);
                    }
                }
            });

        });

这是一个完整的示例,其中

$("#post_content") 便是监听paste事件
2.PHP处理
public function upEditorImg()
    {
        $token = Session::get("user_token");
        if (!$token || $token["id"] <= 0) {
            $this->error("对不起,您没有权限操作");
        }
        // 获取表单上传文件 例如上传了001.jpg
        $base64 = input("base");
        $savePath = Config::get("storage_path.editor");
        $file = Utils::saveBase642Img($base64, $savePath);
        if (!$file) {
            $this->result([], 500, "上传失败,请检查上传文件");
        }
        // 移动到框架应用根目录/public/uploads/ 目录下

        if ($file->check(["size" => 1024 * 1024 * 1, "ext" => "jpg,png,jpeg,gif"])) {
            $entity = [
                "create_time" => time(),
                "title" => $file->getInfo("name"),
                "size" => $file->getInfo("size"),
                "ext" => $file->getExtension(),
                "type" => $file->getInfo("type"),
                "path" => "/upload/editor" . $file->getInfo("build_path"),
                "md5" => $file->md5(),
                "uid" => $token["id"],
            ];
            $pic = new BbsPicture();
            $ret = $pic->insertGetId($entity);
            if (!$ret) {
                $this->result([], 500, "上传失败,请稍后重试");
            }
            $entity["title"] = "screenshots.{$entity["ext"]}";
            $this->result($entity, 1, "上传成功", "Json");
        } else {
            $this->result([], 0, $file->getError(), "Json");
        }
    }

PHP使用了ThinkPHP框架,其中Utils是个人封装的一个base64得

    /**
     * @param $content
     * @param $path
     * @return bool|File
     */
    static public function saveBase642Img($content, $path)
    {
        if (preg_match("/^(data:s*image/(w+);base64,)/", $content, $result)) {
            $type = $result[2];
            $file["type"] = "images/" . $type;
            $file["ext"] = $type;
            $file["save_path"] = $path . DS . date("Ymd") . DS;
            if (!is_dir($file["save_path"])) {
                mkdir($file["save_path"], 0777);
            }
            $file["data"] = base64_decode(str_replace($result[1], "", $content));
            $file["name"] = md5($file["data"]) . ".{$file["ext"]}";
            if (!file_put_contents($file["save_path"] . $file["name"], $file["data"])) {
                return false;
            }
            unset($file["data"]);
            $FILE = new File($file["save_path"] . $file["name"]);
            $file["size"] = $FILE->getSize();
            $file["saveName"] = $file["save_path"] . $file["name"];
            $file["build_path"] = DS . date("Ymd") . DS . $file["name"];

            $FILE->setUploadInfo($file);
            return $FILE;
        } else {
            return false;
        }
    }
参考

https://www.w3.org/TR/clipboa...

https://developer.mozilla.org...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25675.html

相关文章

  • Editor.mdmarkdown实现Sg一样截图粘贴上传

    暂时我还没有把这个做成一个插件,只是简单的几行代码。其中原理就是通过截图后,ev.clipboardData 包含了text和图片文件 数据 原文链接:http://blog.oeynet.com/post/7... showImg(https://segmentfault.com/img/remote/1460000010776970); 1.Js监听paste事件 seajs.use([edi...

    weij 评论0 收藏0
  • 如何将editor.md图片上传改成七牛?

    摘要:之前的编辑器一直用的是但是问题也不少之后觉得换成编辑器首选当然就是主要原因就是界面美观功能全面但是问题也有比如图片上传不知道为什么作者会用那么蛋疼的表单上传难道只是为了兼容看了上的维护时间最后一次维护差不多半年了想让作者来改可能性是不大了那 之前的编辑器一直用的是simditor, 但是问题也不少, 之后觉得换成markdown编辑器, 首选当然就是editor.md, 主要原因就是界...

    sourcenode 评论0 收藏0
  • Wizard 开源文档管理系统1.0发布啦

    摘要:总结如果你在为公司寻找一款开源免费的开发文档文档管理工具,不妨考虑一下项目,一定不会让你失望的。 Wizard 是一款开源文档管理系统,项目地址为 https://github.com/mylxsw/wizard。这个项目是 我 在2017年就开始开发的,起初只是想做一款能够在公司内部把Swagger文档管理起来的工具,但在这近两年的时间里,一直断断续续的为其添加各种功能,现在终于下决...

    cod7ce 评论0 收藏0
  • Markdown-Temp,一款免费开源编辑器(附源码)

    摘要:什么是是一款在线编辑器,她不仅免费开源,而且简单适用。适用于编写临时文档与在线分享。演示地址演示图片源码地址 Markdown-Temp 什么是Markdown-Temp? Markdown-Temp是一款在线Markdown编辑器,她不仅免费开源,而且简单适用。Markdown-Temp适用于编写临时文档与在线分享。 Markdown-Temp说明 编辑器使用Editor.md开发...

    JerryC 评论0 收藏0
  • 前端常用插件、工具类库汇总(下)

    摘要:上一篇前端常用插件工具类库汇总上内容摘要动画库滚动库轮播图滚屏弹出框消息通知下拉框级联选择器颜色选择器时间日期处理表单验证分页插件本篇延续上一篇的内容继续给大家带来一系列关于前端插件工具类的内容。 showImg(https://segmentfault.com/img/bVbjsMh?w=900&h=383); 前言 对本文感兴趣可以先加个收藏,也可以转发分享给身边的小伙伴,以后遇到...

    ideaa 评论0 收藏0

发表评论

0条评论

jollywing

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<