ASP.NET上传大文件解决方案

来源:互联网 发布:java start join 编辑:程序博客网 时间:2024/05/22 10:52

【转自】  http://www.chenjiliang.com/Article/View.aspx?ArticleID=2801

 

这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的
组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,另外还有思归在它的博客堂中所说的办法 http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx

两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。

Lion.Web.UpLoadModule和AspnetUpload 两个.NET组件都是利用的这个方案。

当上传单文件时,两个软件的方法是一样的,继承HttpModule

 

 

----------------------------------------------------源代码开始----------------------------------------------------------------

HttpApplication application1 = sender as HttpApplication;
HttpWorkerRequest request1
    = (HttpWorkerRequest) ((IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest));
try
{
    if (application1.Context.Request.ContentType.IndexOf("multipart/form-data") <= -1)
    {
        return;
    }
    //Check The HasEntityBody
    if (!request1.HasEntityBody())
    {
        return;
    }

    int num1 = 0;
    TimeSpan span1 = DateTime.Now.Subtract(this.beginTime);

    string text1 = application1.Context.Request.ContentType.ToLower();

    byte[] buffer1 = Encoding.ASCII.GetBytes(("/r/n--" + text1.Substring(text1.IndexOf("boundary=") + 9)).ToCharArray());
    int num2 = Convert.ToInt32(request1.GetKnownRequestHeader(11));
    Progress progress1 = new Progress();

    application1.Context.Items.Add("FileList", new Hashtable());

    byte[] buffer2 = request1.GetPreloadedEntityBody();
    num1 += buffer2.Length;

    string text2 = this.AnalysePreloadedEntityBody(buffer2, "UploadGUID");
    if (text2 != string.Empty)
    {
        application1.Context.Items.Add("LionSky_UpLoadModule_UploadGUID", text2);
    }
    bool flag1 = true;
    if ((num2 > this.UpLoadFileLength()) && ((0 > span1.TotalHours) || (span1.TotalHours > 3)))
    {
        flag1 = false;
    }
    if ((0 > span1.TotalHours) || (span1.TotalHours > 3))
    {
        flag1 = false;
    }
    string text3 = this.AnalysePreloadedEntityBody(buffer2, "UploadFolder");
    ArrayList list1 = new ArrayList();
    RequestStream stream1 = new RequestStream(buffer2, buffer1, null, RequestStream.FileStatus.Close, RequestStream.ReadStatus.NoRead, text3, flag1, application1.Context, string.Empty);
    list1.AddRange(stream1.ReadBody);
    if (text2 != string.Empty)
    {
        progress1.FileLength = num2;
        progress1.ReceivedLength = num1;
        progress1.FileName = stream1.OriginalFileName;
        progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;
        application1.Application["_UploadGUID_" + text2] = progress1;
    }
    if (!request1.IsEntireEntityBodyIsPreloaded())
    {
        byte[] buffer4;
        ArrayList list2;
        int num3 = 204800;
        byte[] buffer3 = new byte[num3];
        while ((num2 - num1) >= num3)
        {
            if (!application1.Context.Response.IsClientConnected)
            {
                this.ClearApplication(application1);
            }
            num3 = request1.ReadEntityBody(buffer3, buffer3.Length);
            num1 += num3;
            list2 = stream1.ContentBody;
            if (list2.Count > 0)
            {
                buffer4 = new byte[list2.Count + buffer3.Length];
                list2.CopyTo(buffer4, 0);
                buffer3.CopyTo(buffer4, list2.Count);
                stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
            }
            else
            {
                stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
            }
            list1.AddRange(stream1.ReadBody);
            if (text2 != string.Empty)
            {
                progress1.ReceivedLength = num1;
                progress1.FileName = stream1.OriginalFileName;
                progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;
                application1.Application["_UploadGUID_" + text2] = progress1;
            }
        }
        buffer3 = new byte[num2 - num1];
        if (!application1.Context.Response.IsClientConnected
            && (stream1.FStatus == RequestStream.FileStatus.Open))
        {
            this.ClearApplication(application1);
        }
        num3 = request1.ReadEntityBody(buffer3, buffer3.Length);
        list2 = stream1.ContentBody;
        if (list2.Count > 0)
        {
            buffer4 = new byte[list2.Count + buffer3.Length];
            list2.CopyTo(buffer4, 0);
            buffer3.CopyTo(buffer4, list2.Count);
            stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
        }
        else
        {
            stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
        }
        list1.AddRange(stream1.ReadBody);
        if (text2 != string.Empty)
        {
            progress1.ReceivedLength = num1 + buffer3.Length;
            progress1.FileName = stream1.OriginalFileName;
            progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;
            if (flag1)
            {
                progress1.UploadStatus = Progress.UploadStatusEnum.Uploaded;
            }
            else
            {
                application1.Application.Remove("_UploadGUID_" + text2);
            }
        }
    }
    byte[] buffer5 = new byte[list1.Count];
    list1.CopyTo(buffer5);
    this.PopulateRequestData(request1, buffer5);
}
catch (Exception exception1)
{
    this.ClearApplication(application1);
    throw exception1;
}

----------------------------------------------------源代码结束----------------------------------------------------------------

 

 

而思归所说的方法使用Mime也能上传大文件,在以下地址下载

http://krystalware.com/files/slickupload.zip

不过觉得的思归的方法容易很多


相关文章:

让asp.net默认的上传组件支持进度条反映 
http://blog.joycode.com/dotey/archive/2005/06/12/53557.aspx 宝玉
http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx 思归
http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx bestcomy
http://krystalware.com/wiki/default.aspx/KrystalWiki.UploadSpike1
http://www.blueidea.com/tech/program/2005/2997.asp ftp
通过Web Services上传和下载文件
http://dotnet.aspx.cc/ShowDetail.aspx?id=6381BD5F-51F3-4339-4239-1328564A1B2A
上传组件是如何不受settimeout限制的?
http://www.ietf.org/rfc/rfc1867.txt?number=1867

下载
http://support.microsoft.com/default.aspx?scid=kb;en-us;812406&Product=aspnet


上传源代码下载:

openlabupload.rar
http://files.cnblogs.com/skylaugh/openlabupload.rar

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 被化妆学校坑了怎么办 快车约得太远怎么办 工资好低2000多怎么办 苹果手机不能下载软件怎么办 苹果手机下不了软件怎么办 苹果6s下不了软件怎么办 苹果6下不了软件怎么办 ipad更新系统卡住了怎么办 ipad卡住了关不了机怎么办 ipad卡住了没反应怎么办 苹果7下不了软件怎么办 苹果手机开机密码忘了怎么办 苹果开机密码忘了怎么办 我的ipad很卡怎么办 6s升级后卡顿严重怎么办 软件升级后手机卡顿怎么办 ps通道抠图模糊怎么办 电脑锁屏死机了怎么办 ipad电源键坏了怎么办 华为平板死机黑屏了怎么办 苹果4s锁屏键坏了怎么办 平板电脑密码锁忘记密码怎么办 苹果平板电脑密码锁忘记密码怎么办 平板电脑密码锁密码锁死怎么办 小米平板黑屏按键亮怎么办 小米平板黑屏没反应怎么办 小米平板一刷黑屏了怎么办 小米4卡死了怎么办啊 苹果平板电脑开不了机怎么办 ipad开不了机怎么办都是黑屏 手机突然黑屏了死机状态怎么办 苹果平板死机不能重启怎么办 韩众平板死机了怎么办 苹果平板输入密码多次停用怎么办 ld密码被停用了怎么办 档案被自己丢了怎么办 手机在厂里丢了怎么办 在厂里借工具丢了怎么办 导出的考勤没有姓名怎么办 退休时档案丢了怎么办 职工与企业没有劳资怎么办