0%

同学们在开发asp.net作品的时候经常会用到要把一些文件上传到服务器上,但是这里的迷惑就是这些文件在服务器中是如何存在的?是在文件系统中还是在数据库?如果在文件系统中该如何提取?如果是在数据库中该如何存取?

我的建议是如果是小文件,而且数量有限可以放到数据库中,如果文件很大,同时数量非常多(随着系统的使用越来越多)还是存到文件系统中,然后把访问路径存到数据库中。

但是不管怎样,作为学习我们还是要学会这两种存取文件的方式。下面我们以用户头像文件为例来说明这两种方法。

1.存放到文件系统中

这种方式比较简单,主要是把头像文件上传到特定的文件夹中,同时把它的url相对路径存到数据库中就好了。代码如下

    if (fuAvart.FileContent != null)
    {
        //文件存取路径,存放在avart目录下以用户名命名的目录下
        string path = Server.MapPath("~/avart/" + HttpContext.Current.User.Identity.Name) + "\\";
        //图片的url相对路径
        string url = "~/avart/" + HttpContext.Current.User.Identity.Name + "/" + fuAvart.FileName;
        //如果路径不存在要先创建
        if (!Directory.Exists(path))
            Directory.CreateDirectory(path);
        //文件保存到相关路径下
        fuAvart.SaveAs(path + fuAvart.FileName);
        //把路径保存到数据库中
        string sql = "update users set avarturl='" + url + "' where username='" + HttpContext.Current.User.Identity.Name + "'";
        DataBase.RunSQL(sql);
        iAvart.ImageUrl = url;
    }

这种方式的提取也很简单,就是直接把图片的url值赋值给image控件就行了。一句话iAvart.ImageUrl = reader["avarturl"].ToString();

本部分数据库字段avarturl的类型为nvarchar(256)。

2.存放到数据库中

把图片存放到数据库中需要有一个image类型的字段,
在上传过程中,把图片文件转化成文件流,并把它作为sql命令的参数来执行

    if (fuAvart.FileContent != null)
    {
        string sql = "update users set avart=@avart where username=@username";
        SqlParameter[] prams = new SqlParameter[]{
            new SqlParameter("@avart",System.Data.SqlDbType.Image,fuAvart.FileBytes.Length),
            new SqlParameter("@username",System.Data.SqlDbType.VarChar,50)
        };
        prams[0].Value = fuAvart.FileBytes;
        prams[1].Value = HttpContext.Current.User.Identity.Name;
        DataBase.RunSQL(sql, prams);
        iAvart.ImageUrl = "avart.aspx";
    }

因为图片的显示需要一个新的页面,所以新创建一个文件avart.aspx,page_load中的代码如下:

    string sql = "select * from users where username='" + HttpContext.Current.User.Identity.Name + "'";
    SqlDataReader reader = null;
    DataBase.RunSQL(sql, out reader);
    //设置页面缓冲输出
    Response.Buffer = true;
    //清除缓冲区中的所有内容
    Response.Clear();
    if (reader.Read() && reader["avart"] != DBNull.Value)
    {
        byte[] file = (byte[])reader["avart"];
        //把二进制字符串写入HTTP输出流
        Response.OutputStream.Write(file,0,file.Length); 
    }
    reader.Close();
    //向客户端发送所有缓冲的内容
    Response.Flush();
    ////将当前所有缓冲的输出发送到客户端,并停止该页的执行
    Response.End();

需要显示头像的地方 iAvart.ImageUrl = "avart.aspx";

本部分数据库字段avart,类型image

1.纯粹理性批判

康德的纯粹理性批判基本上是为了回应休谟的彻底的怀疑论。休谟怀疑一切,甚至把科学的基础——因果性都给否认了,这就扰醒了康德“独断论的迷梦”。

康德首先把亚里士多德以来“观念符合对象”的观点颠倒了,他认为首先是“对象符合观念”,所以“观念也符合对象”了。但是对象如何来符合观念呢,他说人有种先天的认识能力,有张认识之网去捕捉经验中的感觉、印象,这就是休谟所说的经验材料,然后把它组织成一个知识体系。

那么这个知识体系的可靠性如何?因为休谟是否定的,康德则认为这个是可靠的。康德承认这个知识体系不是对客观实在对象的真实反映,康德也认为这个是不可能的,在这点上他接受休谟的观点。但是他认为我们这个知识体系是关于观念的,或者说认识的对象是观念的,所以知识体系的客观性与可靠性不在于它是不是反映了客观对象,而在于它跟我们建立起来的对象与对象的观念是不是符合。这个对象的观念是显现给我们的,因而是我们能够感觉到的,康德把它称作现象界。在现象界之外还存在一个我们不知道的世界——物自体世界。

康德的认识之网实际上就是说“人为自然界立法”,这也是认识论上的“哥白尼革命”的由来,因为以前都是观念符合自然的,相当于人的认识逃离不了客观事物,但是现在是人的先天知识结构来建构关于对象的观念,于是对象要符合观念,不符合的一概进入不了知识体系。

康德纯粹理性批判里面要解决的最终问题就是先天综合判断。

所谓先天就是一件事情还没发生之前就已经存在着的,带有着某种必然性。

所谓综合判断就是谓词不包含在主词里面的判断,与它相对的就是谓词已经包含在主词里面的分析判断,按康德的说法分析判断是不生产新知识的,它主要是解释知识,把原来蕴藏在主词里面的知识明显地说出来,而综合判断则是生产知识的,它往往带出新知识。但是一般的综合判断都是后天的,你说“天是蓝的”虽然他说出了一种新的知识,但是它讲的是一种特殊性,因而不具必然性。而一切分析判断倒是先天的,都是必然的。后天的综合判断与先天的分析判断之间的矛盾正式当时经验论与唯理论之间的矛盾。而康德就是想调和这两者。

所以康德研究先天综合判断就是想找到一种知识它既是综合判断,又具有必然性。

康德把因果性恢复了,他认为因果性是主观的,但是它具有普遍性,不是随意的。

康德的认识三部曲:感性、知性、理性。

感性:感受经验材料

知性:用概念范畴等加工感性的东西,以期在一定范围内能够统一。

理性:用先验的原理对知性进行加工,以获得一种超绝的普遍化。其结果就是整个经验世界的统一体,获得了整个世界的的绝对知识,也就是“自在之物”

3.判断力批判

判断力就是把特殊归结为普遍的能力。如果普遍的先知道然后来寻找特殊,这种判断力就叫做规定性的判断力,如果特殊的先知道以此来寻找普遍性的,这种判断力就叫做反思性的判断力。

反思的判断力包括审美的判断力与目的论判断力

反思的判断力有个先验的原则,那就是这世界上存在的大量偶然现象也是有规律的,世界的多样性是先验地统一的。但是这个先验的原则不是为自然界立法,而是为反思的判断力自己立法。所以这里世界的多样性统一并不是说有一个确实存在的目的,而是说世界的“合目的性”

我们从一个审美对象身上我们完整地观照这个对象,而不从这个对象本身取出某种东西进行规定的判断,我们完整地把所有的感性的特质尽收眼底,全身心向它敞开,沉浸于其中,力图感受到某种主观中的普遍性的东西、人性化的东西。这就是反思的判断力。(P109)

审美判断力是按照情感能力的先验原则来判定自然的合目的性的,目的论判断力则不是什么特殊能力,它的作用如同在《纯粹理性批判》中一样也是致力于理论认识,但针对着自然的某些特殊对象(如有机体),并且不是进行普遍规定而是对特殊原则进行反思,即不是纳入知性范畴(知性概念)而是按照自然的目的理念(理性概念)来评定。因此目的论判断力在起源上是出自审美判断力,但就其运用而言却属于哲学的理论部分,对它的批判就既不同于对知性的批判(《纯粹理性批判》),又不同于对审美判断力的批判,后者只属于判断主体及其认识能力的批判。但由于审美判断力批判在一切其他批判中的核心位置,所以它是“一切哲学的入门”①。(P38)

当判断力以其自然合目的性概念使自然规律过渡到自由的最终目的成为可能的时,它就在知性的先天构成性原则(认识能力)和理性的先天构成性原则(欲求能力)之间建立起一座桥梁。(P39)

反思的判断力自己给自己立法。

最终目的:人的幸福,文化

人的幸福:最终目的的被动的质料。

文化:一个理性存在者一般地对于任意一种目的(因而在其自由中)都创造出他的适应性。但是这个分成两部分,一个是熟练技巧,另一个是科学与艺术。

自然界的最终目的:创造本身。不需要任何其他目的作为条件的目的。

因为自然界的一切都是有一个因果链条,所以其最终就会追溯到知性及其根据,但这个根据是超自然的。这个超自然的东西在现实中就是“作为本体的人”,所以人成为了一切目的的最终目的。在《实用人类学》的前言中第一句话就讲到了“人是他自己的目的”。

亚里士多德的《范畴篇》被编到《亚里士多德全集》第一卷第一篇,很久以来都被看做是其创立的逻辑学的重要奠基,但是其实际上也有第一哲学的重要意义。这里仅作个读书笔记。

属加种差是亚里士多德提出的定义法,即为一个事物下定义的时候,首先找到与其最邻近的属概念,然后再加上此种与属概念的差异属性,把两者相加就是一个关于此种的定义。如与人最邻近的属概念是动物,而人与动物相比最显著的差异就是人能够思考,有理性,所以人就是理性的动物,这就是一个典型的属加种差的定义。

本体是既不述说一个主体,也不存在于一个主体中的事物。如个别的人,个别的马

第二本体是可以述说一个主体,但不存在于一个主体中的事物。如人、动物

注意: 在后来的《形而上学》中发生了变化,即第一本体和第二本体的位置互换。这是由于在《形而上学》中,亚里士多德侧重于对存在进行结构分析,侧重于确定本体的另外两个标准,此性(this)和离存性(discrete)。根据这些特点分析,形式作为个别事物的内在构成要素,是使个别事物成为确定的“这一个”的决定方面,因此,形式上升为第一本体。

形而上学原则的意义不在于区分个别事物与种属,而在于区分本体与属性,把属性存在从存在的规定中排除出去,保留种属与个别事物一道作为本体。

根据逻辑原则,只有个别事物才是本体,种属都不是。因为个别事物是最后的主体,它不述说任何事物。

本体是存在中一切其他性质的主体或基础,其逻辑特征为可以充当一切宾词的主词,相对于现象而言,它是存在中的稳定方面。

学生作品中要用到格式化输入内容的功能,于是就用到了在线html编辑器,用过很多的编辑器,从最早的freetextbox,到后来的fck editor,不过近来还是看好百度出的ueditor,KindEditor 貌似也不错。在这里就以ueditor为例来讲讲怎么使用ueditor。

1.下载

当前最新的是1.3.6版,可以在这里下载,选择自己需要的版本。

2.使用

首先,把下载下来的代码解压到你的应用程序根目录,并把该目录改成ueditor(关于路径需要在editor_config.js中修改相应配置);

其次,在需要使用编辑器的页面添加如下代码,注意这里的js文件的路径

<!-- 加载编辑器的容器 -->
<script id="editor" type="text/plain"></script>
    这里写你的初始化内容
</script>
<!-- 配置文件 -->
<script type="text/javascript" src="ueditor.config.js"></script>
<!-- 编辑器源码文件 -->
<script type="text/javascript" src="ueditor.all.js"></script>
<!-- 实例化编辑器 -->
<script type="text/javascript">
    UE.getEditor('editor');
</script>

再次,在asp.net里面获取编辑器里面的内容,代码如下:

string content=Request.Params["editorValue"];

与取值相对应的是赋值,这个比较复杂,一般来说我们在代码中先定义一个public的字符串变量Content,把上述代码

<script id="editor" type="text/plain"></script>
   修改这里
</script>

改成

<script id="editor" type="text/plain"></script>
    <% =Content %>
</script>

这样在当你要给编辑器赋值的时候,只要给Content赋值就行了。

3.配置

ueditor默认的一些路径都是从根目录开始的,如/myProject/ueditor/,所以修改了路径后要修改window.UEDITOR_HOME_URL的值,editor_config.js里还有很多上传有关的路径要修改,没有什么特殊要求,可以用默认的。

此外ueditor的按钮也是可以定制的,因为实际上用不上那么多的按钮,也太复杂了。可以在editor_config.js中修改,也可以在编辑器实例化的时候写代码。

//单行工具   
toolbars: [
    ['fullscreen', 'source', 'undo', 'redo', 'bold']
]

//多行工具,竖线 '|' 代表按钮之间的分割线
toolbars: [
['fullscreen', 'source', 'undo', 'redo'],
['bold', 'italic', 'underline', 'fontborder', 'strikethrough', 'superscript', 'subscript', 'removeformat', 'formatmatch', 'autotypeset', 'blockquote', 'pasteplain', '|', 'forecolor', 'backcolor', 'insertorderedlist', 'insertunorderedlist', 'selectall', 'cleardoc']
]

建议修改按钮的时候把原先的按钮配置先注释掉,再重新选择你需要的按钮。

4.注意事项

可能会出现如下错误:

从客户端(editorValue=”……”)中检测到有潜在危险的 Request.Form 值

这个需要在web.config中设置,有两个地方,第一个地方添加requestValidationMode="2.0",第二个地方添加validateRequest="false",最后的结果类似下面的代码:

    <httpRuntime targetFramework="4.5" requestValidationMode="2.0" />
    <pages validateRequest="false">

今天上课的时候还发现,如果你创建的是网站website而不是项目project,那么整个website在启动的时候会出错,其原因就在于ueditor目录中的app_code中有一些它自己的代码,你需要把它放到根目录下的app_code下面,否则网站不理解这些代码,也就会出错。【2014/5/21 20:19:55 更新】

母亲节快乐!

晚上跟学生约好要检查期末作品,美其名曰中期检查。可惜学生很少发上来,无聊中想联系学生也没什么途径,最后想到弄个微信平台来做教学支持。然后上微信公众平台网站,看看文档是怎么说的。

说实在以前就想开发一个,但是觉得有点高端,不敢下手。但是今天读文档似乎特别有成效,随便看了下就觉得有点懂了。

首先,打开开发模式;

其次,做一个验证交互的页面,通过开发验证。这里使用了ngrok,因为在学校里面只能用这个了,在家里的话花生壳什么的也可以;

再次,通过验证后,就要解析订阅的人发来的消息,然后发送消息给他,这些都是小菜一碟;

然后,下次如果有空把这个功能丰富起来。