zoukankan      html  css  js  c++  java
  • asp.net 上传文件

      公司产品中一直是采用 flash 实现文件上传功能,但用户的需求多了以后遇到了越来越多难以解决的问题,最后试着用硕正提供的freeform、小型页面控件来解决。
      硕正文件上传的实现途径有3、4种,由于公司产品发布的需要,就选择了其中的 httpPost 方案,其它的象 ftp、Http put尽管也是不错的选择,但需要另外建站,或涉及权限问题,恐怕最终用户的部署维护会吃不消。
      httpPost方案还有一个非常好的优点,就是文件上传后是保存到文件还是保存到数据库,都很容易实现。

      我们的需求以及最终实现了的功能特点在此先罗列一下:
      1. 支持多文件上传;
      2. 支持超过4G的大文件上传;
      3. 使用硕正的Zip选项,压缩上传,以减轻带宽压力;
      4. 支持断点续传,记忆对上次失败的发包位置;
      5. 支持异步上传,免得在上传大文件时浏览器卡死;
      6. 有进度条的图示,我们没有采用硕正自带的进度条,而是用js自己写了一个,里面的信息更多,界面更友好;
      7. 可以随时取消上传;

      结合硕正文档,我们完成了开发,最终的界面如下:

      开始上传:
      

      上传中:

      
      上传结束:

      
      

      怎么样, 功能很完备吧?硕正控件是 2px X 2px 躲在左上角,平时看不到。

      如下是源码中的关键部分:
        客户端js: Upload_Client.js
        后端C#: Upload_Server.aspx.cs

      有几点须说明:
      1. 必须采用分包,设定包的尺寸(PartSize),包的大小要适中,太大的话进度条步进太慢,太小的话硕正发起的Request太多会影响效率;
      2. 由于是异步上传,必须充分利用硕正 OnEvent 事件,进度条上的信息就是来自事件参数的;

      如下按工作步骤逐段分析一下这个客户端的js:
      步骤一.打开硕正套件提供的对话框,选择文件
      
      

      步骤二.上传
      
      

      步骤三.发起上传
      

      步骤四.侦听上传事件
      
       

      说明一下:源码中的“Download”的部分,是和上传无关的。其实我们同时也实现了文件下载的功能,用的是硕正全局函数中的“Download”函数,由于下载比较简单,我们在此就不作分析了。

      最后,任务圆满完成。和以前的flash上传相比,双方各有优劣,以下列出一些对比:
       Supcan的优势
      1.1 使用简单,后台基本只需要负责接收数据即可, Flash的 http Body中同时安插了上传参数和文件的二进制流,二者夹杂在一起导致后端解析异常复杂,一旦涉及大数据必须实现接口HttpModule以绕过IIS对文件大小的限制(默认4M),换之以底层抽取Http中的数据,实现难度大,数据接收失败率高,而且后期维护较繁琐。而硕正的http body中就是纯数据,根本不需要解析它,所有的控制参数都安置在URL中,后端解析非常清晰:

      这些参数中还有数据包的MD5参数,后端能轻易验证数据包的正确性;
      1.2 Flash对超大数据支持不足,而Supcan则提供了超过4G的超大数据上传支持;
      1.3 Flash不支持通过传入文件路径进行文件上传方式,而Supcan能很好支持通过路径进行文件上传;
      1.4 Flash不支持断点续传,Supcan本身就是通过数据包方式传输到后台,原生支持断点续传,只要在后端保存已上传的块数,即可支持断点续传;
      1.5 Supcan支持客户端压缩,节省带宽。
       

        Flash的优势
      2.1 浏览器支持多,能很好兼容大部分浏览器,Supcan支持主流浏览器,但在firefox效果不佳,在打开文件选择对话框时会导致控件崩溃情况,硕正的答复是与Firefox的消息处理有底层冲突,无法解决;
      2.2 Flash事件更丰富,提供很多事件接口给开发者调用;
      2.3 Flash文件上传队列做的比较好,能自动逐个上传文件,而Supcan需要在js中循环调用;
      2.4 Flash上传界面支持自定义,允许创建丰富的UI.

     
     
     
    标签: 下载附件上传大数据

    在用户控件(ASCX)创建用户控件(ASCX)

    "我建了两个ascx,ascxA,ascxB
    ascxA中放了一个PlaceHold,
    ascxB中放了一个textBox
    ascxA在page_load中动态创建了5个ascxB但是页面上什么都没显示"



    这是来自论坛网友的问题,Insus.NET就以此问题做一个演示例子,方法与技巧分享给大家。

     在站点上创建一个用户控件ascx B, 拉一个TextBox在这个控件上。
    创建另一个用户控件ascx A 在这个用户控件上,拉一个Textbox 和一个按钮,是让用户在文本框输入数据,点一点铵钮,这样动态产生ascx B用户控件,呈现于ascx A用户控件的页面上。
    在站点上,创建一个aspx网页。把用户控件ascx 引用至aspx网页上。再在aspx网页上拉一个按钮。让用户点一点这个铵钮,去获取动态产生的文本框的值,并显示于aspx网页上。

    现在的问题,ascx A动态加载ascx B. 根据用户输入的数字来产生。
    怎样在aspx网页上,去获取那些动态产生文本框的值?

    好,带着疑问一步一步来完成它们。
    创建一个站点,Insus.NET使用的是.NET 4.0 和C#作为程序语言。
    创建一个AscxB.ascx用户控件:

     View Code

     
    AscxB.ascx.cs:

     View Code

     在站点上创建用户控件AscxA.asx,在此控件上,拉一个文本框TextBox,一个铵钮Button和一个容器PlaceHolder。在铵钮添加onclick事件OnClick="ButtonGenerate_Click"

     View Code


    AscxA.ascx.cs:

     View Code

    下面是动态加载用户控件的方法,为了能让用户控件ascx a加载到ascx b。 Insus.NET在此,先创建接口(interface):

    接口写好,去ascx B实作这个接口:



    我们回到用户控件ascxA cs代码页,去写按钮Click的事件:

     


    上图中的29行代码,是判断文件框是否为空,是不是为数字。
    第35代码,是动态加载用户控件ascx B之后,并转为接口IUserControlable。然后加入PlaceHolder容器中去。

    现在,我们创建一个网页.aspx,在此网页中,我们引用用户控件ascxa,还在拉一个铵钮,和个Literal控件,铵钮与Literal最开始状态是隐藏的,主要是用来获取数据与显示数据。




    .aspx.cs代码:

     View Code


    现在,我们做一些其它,即是说,在Ascx A用户控件,当有动态产生Ascx B控件之后,在网页的Button才会显示。如果没有产生过铵钮,网页Button就是隐藏起来。
    由于是否有控件产生是发生在ascx A用户控件,而隐藏的对象在网页上。这涉及到用户控件与网页之间的沟通与协调。
    为了减低程序的复杂度,Insus.NET得写一个接口,这个接口主体只有一个只写属性。



    接口写好了,我们在网页.aspx.cs实作这个接口。说明白一点,就是网页的铵钮只接受显示与隐藏,是谁来决定显示与隐藏,它管不了。


    具体是谁来控制显示与隐藏呢,刚才所说,是在用户控件ascx A的动态产生ascx B之后,这个网页的Button就显示。因此,我们去用户控件ascx a的产生控件代码中添加:



    有点疑问,怎样能把网页转为接口呢? 因为我们上面有把网页实作了IShowable这个接口。

    Ok, 我们回到网页cs,准备写铵钮click事件,来获取数据。不过获取数据起来,是有点困难,因为动态产生的控件,全是在用户控件ascx A中呈现,而且每呈现的文本框是来自ascx B。
    在网页中,怎样获取俄用户控件的ascx A的容器PlaceHolder呢? Insus.NET只会使用接口,因此还是写另外一个接口,是为了让网页.aspx.cs去读取用户控件的Ascx A的PlaceHolder。



    我们去用户控件ascx A实用这个接口:



    这样子,我们就可以在网页.aspx.cs的获取值的铵钮获取这个容器了。另外,由于容器根据用户的需求,也许不止单一次产生一个ascx B用户控件,也许会有好几个。我们怎样知道哪一个文本框TextBox是哪一个TextBox呢?
    还是写一个接口吧,



    接口写好,我们去ascx B用户控件来实作这个接口:



    到现在为止,我们完全可以去网页代码中,去写铵钮的Click获取值的事件了:


    上面代码中,#0是获取placeholder容器。
    #1是foreach容器中所有文本框。
    #2是显示文本框的值。

    到此为止,算是演示完成了。不过,我们还是来一个最终的效果演示吧:



    Demo source code:
    http://download.cnblogs.com/insus/ASPDOTNET/Ascx_load_ascx_page_getvalue.rar

     
     

    在VS.NET中有时候需要根据不同的条件设置不同的MainForm,例如:在程序第一次运行时候打开设置基本信息或服务器信息窗口等。

    1、找到VS.NET中设置MainForm的窗口:

    2、在编辑窗口中设定条件启动不同的MainForm,例如:通过注册表项是否存在判断程序是否第一次运行。

    3、如果程序是第一次运行,则启动设置窗口,在设置窗口中输入相关的设置,例如:程序使用者的基本信息、数据库服务器信息等等,然后保存相关设置,写入注册表后重新运行程序。

    4、如果不是第一次运行,则启动登陆窗口

     
     
     
  • 相关阅读:
    IIS的各种身份验证详细测试
    HTTP Error 401.3 Unauthorized Error While creating IIS 7.0 web site on Windows 7
    C/S and B/S
    WCF ContractFilter mismatch at the EndpointDispatcher exception
    Configure WCF
    Inheritance VS Composition
    Unhandled Error in Silverlight Application, code 2103 when changing the namespace
    Java RMI VS TCP Socket
    Principles Of Object Oriented Design
    Socket处理发送和接收数据包,一个小实例:
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3150092.html
Copyright © 2011-2022 走看看