• UEditor使用浅析


        UEditor富文本编辑器,百度的良心产品之一。

        记录下我是怎么用UEditor的

        1、引入到项目中,添加对net/bin下Newtonsoft.json的引用

        2、实例化,按照demo中的index.html的形式。把ueditor.config.js和ueditor.all.min.js引过来

            此时,应该可以加载出编辑器了

         3、修改配置

      按照文档中的说明,修改配置分为前台配置项和后台配置项

         前台配置项:ueditor.config.js

         后台配置项:config.json

         成功配置后:

    以上传图片为例,看图片上传是怎么实现的

    首先,我想把 图片上传到我网站的根目录下的 UpLoadFile文件夹下

    在config.json中设置imagePathFormat 文件上传保存路径为 "/UpLoadFile/image/{yyyy}{mm}{dd}/{time}{rand:6}"

    发现图片时不可以显示的,点击html源代码那个按钮,发现图片的src地址不对

    在config.json中设置imageUrlPrefix 设置图片访问前缀 

    成功上传!

     

    图片src路径

    修改之后的

    下面就仔细研究下上传是 怎么实现的,经过仔细研究,有了初步的了解

        在点击多图上传的时候,加载了dialogs/image下的image.html

         在image.js中找到了上传图片的方法

    无奈对js研究过少,看到这里就是完全懵逼的状态,但是可以勉强猜出大概干了啥事:加载配置里的上传路径及其他的上传配置。通过Developer Tools发现,请求路径是这样的:://localhost:16857/Content/ueditorKK/net/controller.ashx?action=uploadimage&encode=utf-8

         在controller.ashx中做了这样的事情:

     Handler action = null;
     action = new UploadHandler(context, new UploadConfig()
                    {
                        上传文件配置
                    });
         action.Process();

      UploadHandler继承自抽象类Handler   

    这时候,UploadHandler中的Process()就要执行了

      byte[] uploadFileBytes = null;
            string uploadFileName = null;
    
            if (UploadConfig.Base64)
            {
                uploadFileName = UploadConfig.Base64Filename;
                uploadFileBytes = Convert.FromBase64String(Request[UploadConfig.UploadFieldName]);
            }
            else
            {
                var file = Request.Files[UploadConfig.UploadFieldName];
                uploadFileName = file.FileName;
    
                if (!CheckFileType(uploadFileName))
                {
                    Result.State = UploadState.TypeNotAllow;
                    WriteResult();
                    return;
                }
                if (!CheckFileSize(file.ContentLength))
                {
                    Result.State = UploadState.SizeLimitExceed;
                    WriteResult();
                    return;
                }
    
                uploadFileBytes = new byte[file.ContentLength];
                try
                {
                    file.InputStream.Read(uploadFileBytes, 0, file.ContentLength);
                }
                catch (Exception)
                {
                    Result.State = UploadState.NetworkError;
                    WriteResult();
                }
            }

    上面的代码将获取上传文件的二进制形式,文件名

     接下来就是获取上传路径,上传

    返回这些东西:

    "state":"SUCCESS",
    "url":"/UpLoadFile/image/20160814/6360679021994094052976991.jpg",
    "title":"psbM9XZV19O.jpg",
    "original":"psbM9XZV19O.jpg",
    "error":null

    然后,图片就直接展示出来了

    这就是UEditor上传图片的过程

     

    接下来就是如何把图片上传到第三方云存储上

    上面的代码已经得到了文件的二进制形式和文件名

     又拍云的用法

    1、引入UpYun.cs文件

    2、将原来上传的代码改为如下

     1    //上传到又拍云
     2         //年月日加上文件的MD5值作为文件名
     3     文件名        设置         
     4         try
     5         {
     6         
     7             // 域名http://amayergogh.b0.upaiyun.com/
     8             UpYun upyun = new UpYun("amayergogh", "admin1", "adminheheda");
     9 
    10             /// 设置待上传文件的 Content-MD5 值(如又拍云服务端收到的文件MD5值与用户设置的不一致,将回报 406 Not Acceptable 错误)
    11             // upyun.setContentMD5(UpYun.md5_file(@"D:\"));
    12             upyun.setContentMD5(CommonHelper.CalcMD5(uploadFileBytes));
    13             bool uploadResult = upyun.writeFile(upYunFilePath, uploadFileBytes, true);
    14             if (uploadResult == true)
    15             {
    16                 Result.Url = "又拍云地址    " + upYunFilePath;//返回给UEditor的插入编辑器的图片的src
    17                 Result.State = UploadState.Success;
    18             }
    19             else
    20             {
    21                 Result.State = UploadState.FileAccessError;
    22                 Result.ErrorMessage = "上传到又拍云失败";
    23                 logger.Error("上传文件失败");
    24             }
    25         }
    26         catch (Exception e)
    27         {
    28             Result.State = UploadState.FileAccessError;
    29             Result.ErrorMessage = e.Message;
    30             logger.Error("上传文件失败,发生异常:", e);
    31         }
    32         finally
    33         {
    34             WriteResult();
    35         }

    七牛云的用法:

    还是比较麻烦的

     1、引用SDK到项目中(好庞大) ,引用dll文件

    2、获取  Access Key 和 Secret Key

    3、http://developer.qiniu.com/code/v6/sdk/csharp.html 官方文档上的文件上传方式是直接以文件的形式上传的

      而我们这里想以流的方式上传

      所以,改造PutFile

     1    public CallRet PutFile(string upToken, byte[] FileBytes, string key)
     2         {
     3         
     4             PutAuthClient client = new PutAuthClient(upToken);
     5             CallRet ret;
     6             using (Stream fs=new MemoryStream(FileBytes))
     7             {
     8                 int block_cnt = block_count(fs.Length);
     9                 long fsize = fs.Length;
    10                 extra.Progresses = new BlkputRet[block_cnt];
    11                 byte[] byteBuf = new byte[BLOCKSIZE];
    12                 int readLen = BLOCKSIZE;
    13                 for (int i = 0; i < block_cnt; i++)
    14                 {
    15                     if (i == block_cnt - 1) { 
    16                         readLen = (int)(fsize - (long)i * BLOCKSIZE);
    17                     }
    18                     fs.Seek((long)i * BLOCKSIZE, SeekOrigin.Begin);
    19                     fs.Read(byteBuf, 0, readLen);
    20                     BlkputRet blkRet = ResumableBlockPut(client, byteBuf, i, readLen);
    21                     if (blkRet == null)
    22                     {
    23                         extra.OnNotifyErr(new PutNotifyErrorEvent(i, readLen, "Make Block Error"));
    24                     }
    25                     else
    26                     {
    27                         extra.OnNotify(new PutNotifyEvent(i, readLen, extra.Progresses[i]));
    28                     }
    29                 }
    30                 ret = Mkfile(client, key, fsize);
    31             }
    32             if (ret.OK)
    33             {
    34                 if (PutFinished != null)
    35                 {
    36                     PutFinished(this, ret);
    37                 }
    38             }
    39             else
    40             {
    41                 if (PutFailure != null)
    42                 {
    43                     PutFailure(this, ret);
    44                 }
    45             }
    46             return ret;
    47         }

    上传方法

     1       Qiniu.Conf.Config.ACCESS_KEY = "";
     2         Qiniu.Conf.Config.SECRET_KEY = "";
     3         string bucketName = ""; //空间名
     4         PutPolicy put = new PutPolicy(bucketName, 3600);
     5         string uptoken = put.Token();
     6         Settings setting = new Settings();
     7         ResumablePutExtra extra = new ResumablePutExtra();
     8         ResumablePut client = new ResumablePut(setting, extra);
     9    
    10         //设置上传的文件的key值  文件名
    11         String key = 文件名
    12         //调用PutFile()方法上传
    13 
    14         try
    15         {
    16             CallRet callRet = client.PutFile(uptoken, uploadFileBytes, key);
    17             if (callRet.OK == true)
    18             {
    19                 Result.Url = "http://o7clwdmua.bkt.clouddn.com/" + key;
    20                 Result.State = UploadState.Success;
    21             }
    22             else
    23             {
    24                 Result.ErrorMessage = "失败了";
    25             }
    26         }
    27         catch (Exception e)
    28         {
    29             Result.State = UploadState.FileAccessError;
    30             Result.ErrorMessage = e.Message;
    31             logger.Error("上传文件失败,发生异常:", e);
    32         }
    33         finally
    34         {
    35             WriteResult();
    36         }
    Amayer

    总结:UEditor很强大

  • 相关阅读:
    python sys.argv[]
    python 继承
    python 类/对象
    Formily教程 | formily是中后台复杂场景的表单解决方案
    如何保障消息100%投递成功?如何保证消息幂等性
    rabbitmq延时重试队列
    IO多路复用之select、poll、epoll详解
    构建PHP微服务生态
    flutter dio 处理200以为的错误状态码
    [git] 如何查看 .patch 文件
  • 原文地址:https://www.cnblogs.com/Amayer/p/5770628.html
Copyright © 2020-2023  润新知