kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了。 在这里我着重介绍一些使用kindeditor修改图片上传路径并通过webapi上传图片到图片服务器的方案。

因为我使用的开发语言是C#&ASP.NET MVC。所以首先需要在项目中引用LitJSON.dll,如下图:

我们修改上传文件:upload_json.ashx

<%@ WebHandler Language="C#" Class="Upload" %>

/**
 * KindEditor ASP.NET
 *
 * 本ASP.NET程序是演示程序,建议不要直接在实际项目中使用。
 * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
 *
 */

using System;
using System.Collections;
using System.Web;
using System.IO;
using System.Globalization;
using LitJson;

public class Upload : IHttpHandler
{
    private HttpContext context;

    public void ProcessRequest(HttpContext context)
    {
        //定义允许上传的文件扩展名
        Hashtable extTable = new Hashtable();
        extTable.Add("image", "gif,jpg,jpeg,png,bmp");
        extTable.Add("flash", "swf,flv");
        extTable.Add("media", "swf,flv,mp3,wav,wma,wmv,mid,avi,mpg,asf,rm,rmvb");
        extTable.Add("file", "doc,docx,xls,xlsx,ppt,htm,html,txt,zip,rar,gz,bz2");
        //最大文件大小
        ;
        this.context = context;

        HttpPostedFile imgFile = context.Request.Files["imgFile"];
        if (imgFile == null)
        {
            showError("请选择文件。");
        }
        //文件类型
        String dirName = context.Request.QueryString["dir"];
        if (String.IsNullOrEmpty(dirName))
        {
            dirName = "image";
        }
        if (!extTable.ContainsKey(dirName))
        {
            showError("目录名不正确。");
        }
        String fileName = imgFile.FileName;
        String fileExt = Path.GetExtension(fileName).ToLower();

        if (imgFile.InputStream == null || imgFile.InputStream.Length > maxSize)
        {
            showError("上传文件大小超过限制。");
        }

        ).ToLower()) == -)
        {
            showError("上传文件扩展名是不允许的扩展名。\n只允许" + ((String)extTable[dirName]) + "格式。");
        }
        var saveDir = context.Request["saveDir"];
        string saveDirStr = null;
        if (saveDir == null)
        {
            saveDirStr = "tmp";
        }
        else
        {
            saveDirStr = saveDir.ToString();
        }
        //是否分布式上传
        bool isDFS = false;
        var dfs = context.Request["dfs"];
        ")
        {
            isDFS = true;
        }
        Hashtable hash = new Hashtable();
        if (isDFS)
        {
            var imageUrl = Cloud.Utility.ConfigHelper.Images_SITE_URL;
            var client = new RestSharp.RestClient(imageUrl);//TODO api基路径
            var request = new RestSharp.RestRequest("file/upload", RestSharp.Method.POST);
            request.AlwaysMultipartFormData = true;
            request.AddHeader("dir", dirName + "/" + saveDirStr);
            request.AddHeader("imageUrl", imageUrl);
            request.AddFile("file", Cloud.Utility.StreamHelper.ConvertToBytes(imgFile.InputStream), context.Server.HtmlEncode(imgFile.FileName));

            var posttask = client.ExecutePostTaskAsync(request);
            if (posttask.Result.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var url = posttask.Result.Content.Trim(new char[] { '[', ']', '"' });
                hash["url"] = url;
            }
            else
            {
                showError("分布式上传失败");
            }
        }
        else
        {
            //文件保存目录
            string savePath = "/upload/kindeditor/" + dirName + "/" + saveDirStr;
            String dirPath = context.Server.MapPath(savePath);
            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }

            String newFileName = DateTime.Now.ToString("_yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
            String filePath = dirPath + "/" + newFileName;
            imgFile.SaveAs(filePath);
            hash["url"] = savePath + "/" + newFileName;
        }
        hash[;
        context.Response.AddHeader("Content-Type", "text/html; charset=UTF-8");
        context.Response.Write(JsonMapper.ToJson(hash));
        context.Response.End();
    }

    private void showError(string message)
    {
        Hashtable hash = new Hashtable();
        hash[;
        hash["message"] = message;
        context.Response.AddHeader("Content-Type", "text/html; charset=UTF-8");
        context.Response.Write(JsonMapper.ToJson(hash));
        context.Response.End();
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}

全部代码

客户端传过来一个文件保存目录的参数:saveDir

  var saveDir = context.Request["saveDir"];
        string saveDirStr = null;
        if (saveDir == null)
        {
            saveDirStr = "tmp";
        }
        else
        {
            saveDirStr = saveDir.ToString();
        }

客户端传过来一个是否上传文件到图片服务器的参数:dfs,如果dfs=1代表上传到图片服务器,否则上传到本地

    //是否分布式上传
        bool isDFS = false;
        var dfs = context.Request["dfs"];
        ")
        {
            isDFS = true;
        }

上传文件的核心代码:其中使用到了一个开源的上传组件RestSharp

 Hashtable hash = new Hashtable();
        if (isDFS)
        {
            var imageUrl = Cloud.Utility.ConfigHelper.Images_SITE_URL;
            var client = new RestSharp.RestClient(imageUrl);//TODO api基路径
            var request = new RestSharp.RestRequest("file/upload", RestSharp.Method.POST);
            request.AlwaysMultipartFormData = true;
            request.AddHeader("dir", dirName + "/" + saveDirStr);
            request.AddHeader("imageUrl", imageUrl);
            request.AddFile("file", Cloud.Utility.StreamHelper.ConvertToBytes(imgFile.InputStream), context.Server.HtmlEncode(imgFile.FileName));

            var posttask = client.ExecutePostTaskAsync(request);
            if (posttask.Result.StatusCode == System.Net.HttpStatusCode.OK)
            {
                var url = posttask.Result.Content.Trim(new char[] { '[', ']', '"' });
                hash["url"] = url;
            }
            else
            {
                showError("分布式上传失败");
            }
        }
        else
        {
            //文件保存目录
            string savePath = "/upload/kindeditor/" + dirName + "/" + saveDirStr;
            String dirPath = context.Server.MapPath(savePath);
            if (!Directory.Exists(dirPath))
            {
                Directory.CreateDirectory(dirPath);
            }

            String newFileName = DateTime.Now.ToString("_yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + fileExt;
            String filePath = dirPath + "/" + newFileName;
            imgFile.SaveAs(filePath);
            hash["url"] = savePath + "/" + newFileName;
        }

WebApi文件上传方法如下:

 [Route("file/upload")]
        [HttpPost]
        public async Task<HttpResponseMessage> PostFormData()
        {

            // Check if the request contains multipart/form-data.
            if (!Request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }
            var dir = Request.Headers.GetValues("dir").First();
            var imageUrl = Request.Headers.GetValues("imageUrl").First();

            string root = System.Web.HttpContext.Current.Server.MapPath(Path.Combine("~/images/", dir));

            if (System.IO.Directory.Exists(root) == false)
            {
                System.IO.Directory.CreateDirectory(root);
            }

            var provider = new MultipartFormDataStreamProvider(root);
            provider = new RenamingMultipartFormDataStreamProvider(root);//重命名写法

            await Request.Content.ReadAsMultipartAsync(provider);

            var urlList = new List<string>();
            var url = "";
            foreach (MultipartFileData file in provider.FileData)
            {
                string path = file.LocalFileName;
                var start = path.IndexOf("\\images");
                path = path.Substring(start);
                var mainURL = imageUrl;// ConfigurationManager.AppSettings["MainImageURL"];
                url = mainURL + path.Replace("\\", "/");
                urlList.Add(url);
                //return Request.CreateResponse(HttpStatusCode.OK, url);
            }

            return Request.CreateResponse(HttpStatusCode.OK, urlList);

        }

其中文件重命名方法为:

  /// <summary>
    /// 文件上传并重命名
    /// </summary>
    public class RenamingMultipartFormDataStreamProvider : MultipartFormDataStreamProvider
    {
        public string Root { get; set; }

        public RenamingMultipartFormDataStreamProvider(string root)
            : base(root)
        {
            Root = root;
        }

        public override string GetLocalFileName(HttpContentHeaders headers)
        {
            string filePath = headers.ContentDisposition.FileName;

            // Multipart requests with the file name seem to always include quotes.
            if (filePath.StartsWith(@"""") && filePath.EndsWith(@""""))
                filePath = filePath.Substring(, filePath.Length - );
           return Path.GetFileNameWithoutExtension(filePath)+ DateTime.Now.ToString("_yyyyMMddHHmmss_ffff", DateTimeFormatInfo.InvariantInfo) + Path.GetExtension(filePath).ToLower();
            return filePath;
        }

    }

mvc views文件kindeditor的配置如下:

 KindEditor.ready(function (K) {
        window.NewsContent = K.create("#Content", {
            cssPath: '/Content/kindeditor-4.1.10/plugins/code/prettify.css',
            uploadJson: '/Content/kindeditor-4.1.10/asp.net/upload_json.ashx?saveDir=news_content&dfs=0',
            fileManagerJson: '/Content/kindeditor-4.1.10/asp.net/file_manager_json.ashx',
            allowFileManager: true,
            afterCreate: function () {
                this.sync();
            },
            afterBlur: function () {
                this.sync();
            }
        });
        $(".ke-container").addClass("form-control");
    });

主要配置的是UploadJson参数:saveDir代表保存的目录,dfs代表是否上传到图片服务器。

												

kindeditor修改图片上传路径-使用webapi上传图片到图片服务器的更多相关文章

  1. kindeditor扩展粘贴图片功能&修改图片上传路径并通过webapi上传图片到图片服务器

    前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...

  2. kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器

    前言 kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. 本篇博文需要解决的问题有两个: kindeditor扩展粘贴图片功 ...

  3. PHP结合Ueditor并修改图片上传路径

    投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2016-10-16 我要评论 使用ueditor编辑器,附件默认在ueditor/php/upload/, 但是大家的附件地址的默认路 ...

  4. UMEditor(Ueditor mini)修改图片上传路径

    UMEditor(Ueditor mini)修改图片上传路径 imageUp.ashx string pathbase = "/UpLoad/images/"; //保存文件夹在网 ...

  5. PHP结合Ueditor并修改图片上传路径 微信小程序 拼接域名显示图片

    前言 在使用UEditor编辑器时,一般我们都是需要修改默认的图片上传路径的,下面是我整理好的修改位置和方法供大家参考. 操作 Ueditor PHP版本本身自带了一套上传程序,我们可以在此基础中,找 ...

  6. jeecg uedit 自定义图片上传路径

    jeecg uedit 图片上传配置自定义物理路径,简单描述:我们知道 jeecg 中使用的 uedit 默认图片上传路径为 "当前项目\plug-in\ueditor\jsp\upload ...

  7. ashx 图片上传路径URL

    ashx 图片上传   为了方便多出调用图片上传方法       首先我们将图片上传方法抽离出来 创建ashx 一个新的方法 using System; using System.Collection ...

  8. php 图片上传的公共方法(按图片宽高缩放或原图)

    写的用于图片上传的公共方法类调用方法: $upload_name='pic';$type = 'logo_val';$file_name = 'logo_' . $user_id .create_st ...

  9. 使用FormData数据做图片上传: new FormData() canvas实现图片压缩

    使用FormData数据做图片上传: new FormData()       canvas实现图片压缩 ps: 千万要使用append不要用set   苹果ios有兼容问题导致数据获取不到,需要后台 ...

随机推荐

  1. 【转】Hibernate和IBatis对比

    原文地址:http://blog.csdn.net/ya2dan/article/details/7396598 项目也做过几个, 使用IBatis就做一个项目, 基本上都是使用Hibernate, ...

  2. 获取元素最终的background-color

    通常我们都会先获取元素,然后得到style对象获取对应的css属性值: 下面,假设我定义一个div并在css中给定了指定的background-color: 这里并没有考虑!important/内联的 ...

  3. JAVA 在程序中存储和修改信息

    1.语句和表达式 计算机程序是一组告诉计算机什么的指令,每一个指令称为语句. 2.指定变量类型 变量名.变量存储的信息类型 整型int(-2.14*109~2.14*109).浮点型float(38位 ...

  4. 前端总结·基础篇·CSS(三)补充

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 目录 一.移动端 1.1 视口(viewport) 1.2 媒体查询(medi ...

  5. 整型转字符串(convert int to char)优化实践

    0. 前言 其实基本都没什么机会做这么一个基础的优化,一般基础库里就有函数可以直接拿来用. 这里以snprintf为基准,给大家展示一下每一个优化带来的些许收益. 1. 优化过程 1.最初使用的是sn ...

  6. Laravel路由和控制器的绑定

    路由和控制器的关系 路由文件地址在\app\Http\routes.php,我们来看两种不同的路由. Route::get('/', function () { return view('welcom ...

  7. HTML5之通信和多线程

    HTML通信 跨文档消息传输 HTML5提供了在网页文档之间相互接收和发送信息的功能,使用这个功能,只要获取到网页所在窗口对象的实例,不仅同源(域+端口)的网页可以相互通信,甚至可以实现跨域通信.涉及 ...

  8. Java体系结构---垃圾回收

    1 垃圾回收 1.1 JVM的体系结构 1.1.1  JVM 相当与JAVA 的操作系统,是运行JAVA Class文件的程序. 1.1.2  JVM体系 监控调优,运行时内存结构,类加载,calss ...

  9. 1647: [Usaco2007 Open]Fliptile 翻格子游戏

    1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 423  Solved: 173[ ...

  10. 个人C++学习路线

    这段时间学习<<C++ primer >> 第四版,一边学一遍考虑,要怎么样往深处学习.查了网上的学习路线,知乎大神的问题回答,整理了一下思路,如下吧: <<C++ ...