C#笔记:Ueditor上传文件引入数据库

项目下载:http://pan.baidu.com/s/1gd8aJvH 密码:qu4c

改造目的:引入数据库进行文件的管理

1、找到config.json,改

 "filePathFormat": "upload/file/{time}{rand:6}", //其实不改也没关系。

2、找到UploadHander.cs,改成下面这样。这样就能在上传的时候进行入库

if (!Directory.Exists(Path.GetDirectoryName(localPath)))
            {
                Directory.CreateDirectory(Path.GetDirectoryName(localPath));
            }
            File.WriteAllBytes(localPath, uploadFileBytes);
            Result.Url = savePath;
            Result.State = UploadState.Success;
            /*下面进行数据库处理*/
            UEditor示例网站.Models.File fileInfo = new UEditor示例网站.Models.File();
            fileInfo.FileName = Result.OriginFileName;
            fileInfo.FilePath = savePath;
            fileInfo.Id = Guid.NewGuid().ToString();
            fileInfo.UploaderId = 1; //这里记录上传者的ID。随便写了个1。
            fileInfo.SaveOrUpdate();

3、配合自带的文件管理器显示数据库中的文件。而不是遍历文件夹。 

1)修改了ListFileHander.cs默认的FileList的类型,默认是List<string>。不太利于完成我们的任务。 2)添加一个新的内部类 FileInfo,把FileList改成List<FileInfo>类型.

3)writeresult也要进行修改以适配FileList类型的变化。

4)添加新的类 DataBaseListFileHander.cs继承ListFileHander。里面添加读取数据库的处理。

改的地方太多了。直接贴代码了。

public class ListFileManager : Handler
{
    public enum ResultState
    {
        Success,
        InvalidParam,
        AuthorizError,
        IOError,
        PathNotFound
    }
    public class FileInfo //1、增加一个内部类,来完成使命
    {
        public string Url;//上传文件的路径
        public string Title;//名字
    }
    public int Start;
    public int Size;
    public int Total;
    public ResultState State;
    public String PathToList;
    public List<FileInfo> FileList;//2、默认的string已经不能完成任务了
    public String[] SearchExtensions;
    public ListFileManager(HttpContext context, string pathToList, string[] searchExtensions)
        : base(context)
    {
        this.SearchExtensions = searchExtensions.Select(x => x.ToLower()).ToArray();
        this.PathToList = pathToList;
    }
    public override void Process()
    {
        try
        {
            Start = String.IsNullOrEmpty(Request["start"]) ? 0 : Convert.ToInt32(Request["start"]);
            Size = String.IsNullOrEmpty(Request["size"]) ? Config.GetInt("imageManagerListSize") : Convert.ToInt32(Request["size"]);
        }
        catch (FormatException)
        {
            State = ResultState.InvalidParam;
            WriteResult();
            return;
        }
        var buildingList = new List<String>();
        try
        {
            var localPath = Server.MapPath(PathToList);
            buildingList.AddRange(Directory.GetFiles(localPath, "*", SearchOption.AllDirectories)
                .Where(x => SearchExtensions.Contains(Path.GetExtension(x).ToLower()))
                .Select(x => PathToList + x.Substring(localPath.Length).Replace("\\", "/")));
            Total = buildingList.Count;
            var templist = buildingList.OrderBy(x => x).Skip(Start).Take(Size).ToArray();
            foreach (var item in templist)
            {
                FileList.Add(new FileInfo() { Url = item, Title = item });
            }
        }
        catch (UnauthorizedAccessException)
        {
            State = ResultState.AuthorizError;
        }
        catch (DirectoryNotFoundException)
        {
            State = ResultState.PathNotFound;
        }
        catch (IOException)
        {
            State = ResultState.IOError;
        }
        finally
        {
            WriteResult();
        }
    }
    public void WriteResult()//这个函数也因为实体改变,需要进行一点修正
    {
        WriteJson(new
        {
            state = GetStateString(),
            list = FileList == null ? null : FileList.Select(x => new { url = x.Url, title = x.Title }),
            start = Start,
            size = Size,
            total = Total
        });
    }
    private string GetStateString()
    {
        switch (State)
        {
            case ResultState.Success:
                return "SUCCESS";
            case ResultState.InvalidParam:
                return "参数不正确";
            case ResultState.PathNotFound:
                return "路径不存在";
            case ResultState.AuthorizError:
                return "文件系统权限不足";
            case ResultState.IOError:
                return "文件系统读取错误";
        }
        return "未知错误";
    }
}
public class DataBaseListFileManager : ListFileManager
{
    public DataBaseListFileManager(HttpContext context, string pathToList, string[] searchExtensions)
        : base(context, pathToList, searchExtensions)
    {
    }
    public override void Process()
    {
        try
        {
            Start = String.IsNullOrEmpty(Request["start"]) ? 0 : Convert.ToInt32(Request["start"]);
            Size = String.IsNullOrEmpty(Request["size"]) ? Config.GetInt("imageManagerListSize") : Convert.ToInt32(Request["size"]);
        }
        catch (FormatException)
        {
            State = ResultState.InvalidParam;
            WriteResult();
            return;
        }
        var buildingList = new List<FileInfo>();
        try
        {
            var localPath = Server.MapPath(PathToList);
            //buildingList.AddRange(Directory.GetFiles(localPath, "*", SearchOption.AllDirectories)
            //    .Where(x => SearchExtensions.Contains(Path.GetExtension(x).ToLower()))
            //    .Select(x => PathToList + x.Substring(localPath.Length).Replace("\\", "/")));
            //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            //这里把原来的注释掉,改成从数据库里取数据 
            string xmlpath = UEditor示例网站.Controllers.HomeController.fileInfoXmlPath;
            var nodes = XmlHelper.Search(xmlpath, "File", "UploaderId#1");
            foreach (var item in nodes)
            {
                buildingList.Add(new FileInfo() { Url = item.Value, Title = item.Attribute("FileName").Value });
            }
            FileList = buildingList.OrderBy(x => x.Url).Skip(Start).Take(Size).ToList();
            Total = buildingList.Count;
            
        }
        catch (UnauthorizedAccessException)
        {
            State = ResultState.AuthorizError;
        }
        catch (DirectoryNotFoundException)
        {
            State = ResultState.PathNotFound;
        }
        catch (IOException)
        {
            State = ResultState.IOError;
        }
        finally
        {
            WriteResult();
        }
    }
}

4、因为在上面,我们把传入的json已经添加了新的信息。前台相应的js需要进行修改。打开attachment.js。

修改PushData函数。

 /* 添加图片到列表界面上 */
        pushData: function (list) {
            var i, item, img, filetype, preview, icon, _this = this,
                urlPrefix = editor.getOpt('fileManagerUrlPrefix');
            for (i = 0; i < list.length; i++) {
                if(list[i] && list[i].url) {
                    item = document.createElement('li');
                    icon = document.createElement('span');
                    filetype = list[i].url.substr(list[i].url.lastIndexOf('.') + 1);
                    if ( "png|jpg|jpeg|gif|bmp".indexOf(filetype) != -1 ) {
                        preview = document.createElement('img');
                        domUtils.on(preview, 'load', (function(image){
                            return function(){
                                _this.scale(image, image.parentNode.offsetWidth, image.parentNode.offsetHeight);
                            };
                        })(preview));
                        preview.width = 113;
                        preview.setAttribute('src', urlPrefix + list[i].url + (list[i].url.indexOf('?') == -1 ? '?noCache=':'&noCache=') + (+new Date()).toString(36) );
                    } else {
                        var ic = document.createElement('i'),
                            textSpan = document.createElement('span');
                        textSpan.innerHTML = list[i].url.substr(list[i].url.lastIndexOf('/') + 1);
                        //1、把传入的文件名改了。
                        if (list[i].title) {
                            textSpan.innerHTML = list[i].title;
                        }
                        preview = document.createElement('div');
                        preview.appendChild(ic);
                        preview.appendChild(textSpan);
                        domUtils.addClass(preview, 'file-wrapper');
                        domUtils.addClass(textSpan, 'file-title');
                        domUtils.addClass(ic, 'file-type-' + filetype);
                        domUtils.addClass(ic, 'file-preview');
                    }
                    domUtils.addClass(icon, 'icon');
                    item.setAttribute('data-url', urlPrefix + list[i].url);
                    if (list[i].original) {
                        item.setAttribute('data-title', list[i].original);
                    }
                    //alert(list[i].title);
                    //2、把传入的文件名改了。好了,完工了。
                    if (list[i].title) {
                        item.setAttribute('data-title', list[i].title);
                    }
                    item.appendChild(preview);
                    item.appendChild(icon);
                    this.list.insertBefore(item, this.clearFloat);
                }
            }
        },

4、最后,把调用的地方改了。Controller.ashx

 case "listfile":
                action = new DataBaseListFileManager(context, Config.GetString("fileManagerListPath"), Config.GetStringList("fileManagerAllowFiles"));
                break;

完工了。应该还是比较简单吧。具体的关系很容易就能弄清。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小皮咖

underscore 诞生记(一)—— 基本结构搭建

underscore 是一款成熟可靠的第三方开源库,正如 jQuery 统一了不同浏览器之间的 DOM 操作的差异,让我们可以简单地对 DOM 进行操作,und...

6320
来自专栏云爬虫技术研究笔记

我为什么不建议你使用Python3.7.3?

之前使用Python的环境一直是Python3.7.3的,一直使用的很正常,没有什么毛病,直到最近做一个图片下载器的时候发现了问题。

28930
来自专栏前端桃园

Webpack优化——将你的构建效率提速翻倍

随着构建体系不断完善、构建体验不断优化,webpack 已经逐渐成为了前端构建体系的一大霸主,对于工作中的真正意义上的前端工程项目,webpack 已经成为了我...

9510
来自专栏喵君手记

5分钟详解chrome浏览器架构知识

在从事前端开发过程中,浏览器作为最重要的开发环境,浏览器基础是前端开发人员必须掌握的基础知识点,它贯穿着前端的整个网络体系。对浏览器原理的了解,决定...

12410
来自专栏云爬虫技术研究笔记

由一次线上故障来理解下TCP三握、四挥 & Java堆栈分析到源码的探秘

该服务主要是提供对外的代理接口,大部分接口都会调用第三方接口,获取数据后做聚合处理后,提供给客户端使用。

5810
来自专栏全栈修仙之路

Angular 工具篇之分析包的大小

本文将介绍如何使用 webpack-bundle-analyzer 和 source-map-explorer 这两款工具来分析 Angular Bundle ...

9740
来自专栏前端桃园

(建议收藏)原生JS灵魂之问, 请问你能接得住几个?(上)

笔者最近在对原生JS的知识做系统梳理,因为我觉得JS作为前端工程师的根本技术,学再多遍都不为过。打算来做一个系列,一共分三次发,以一系列的问题为驱动,当然也会有...

13010
来自专栏全栈修仙之路

Angular Multi Providers 和 APP_INITIALIZER

有些时候,我们希望在 Angular 应用程序启动的时候,执行一些初始化操作。针对这种场景,我们可以利用 APP_INITIALIZER 这个内置的 Token...

8020
来自专栏编程微刊

从零开始学习React-目录结构,创建组件页面(二)

1:打开编辑器,导入上一节的创建的项目,开始查看目录结构,manifest.json指定了开始页面index.html,一切的开始都从这里开始。

8710
来自专栏全栈修仙之路

RxJS mergeMap和switchMap

假设现在有一个简单的任务:页面上有一个按钮,当你点击按钮的时候,需要启动一个定时器。使用 RxJS 我们可以可以很方便地实现上述功能:

10230

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励