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、如果不是第一次运行,则启动登陆窗口

     
     
     
  • 相关阅读:
    EasyUI项目驱动学习
    给你一个能生成1到5随机数的函数,用它写一个函数生成1到7的随机数。 (即,使用函数rand5()来实现函数rand7())
    python手记(42)
    Succession
    第一节,学习cocos2d-x的前期准备
    DOM与JavaScript、jQuery之间的关系
    HTML5 精灵8方向移动+背景滚动+音效播放+鼠标事件响应
    Oracle多行记录合并自定义函数
    MSP430F5438 I2C学习笔记——AT24C02
    OPENCV 常用函数
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3150092.html
Copyright © 2011-2022 走看看