这是我在网上查到了:
第一部分:
    首先我们来说一下如何解决ASP.NET中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>
这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。实现方法如下:
IServiceProviderprovider=(IServiceProvider)HttpContext.Current;HttpWorkerRequestwr=(HttpWorkerRequest)provider.GetService(typeof(HttpWorkerRequest));byte[]bs=wr.GetPreloadedEntityBody();if(!wr.IsEntireEntityBodyIsPreloaded())
{
Int  n=1024;
byte[]  bs2=newbyte[n];while(wr.ReadEntityBody(bs2,n)>0)
{

}}这样就可以解决了大文件的上传问题了。但是我不知道这段代码应该怎么用
我是用WebClient上传文件的,代码如下:
string fileName = fileNamePath.Substring(fileNamePath.LastIndexOf("\\") + 1);
        string uriString = @"D:\" + DateTime.Now.ToShortDateString();
        string fileNameExt = fileName.Substring(fileName.LastIndexOf(".") + 1);//文件名称+后缀
        if (uriString.EndsWith(@"\") == false)
        {
            uriString = uriString + @"\";
        }
        uriString = uriString + fileName;
        // 创建WebClient实例
        WebClient myWebClient = new WebClient();
        myWebClient.Credentials = CredentialCache.DefaultCredentials;
        // 要上传的文件
        FileStream fs = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read);
        BinaryReader r = new BinaryReader(fs);
        try
        {
            //使用UploadFile方法可以用下面的格式
            //myWebClient.UploadFile(uriString,"PUT",fileNamePath);
            byte[] postArray = r.ReadBytes((int)fs.Length);
            Stream postStream = myWebClient.OpenWrite(uriString, "PUT");
            if (postStream.CanWrite)
            {
                postStream.Write(postArray, 0, postArray.Length);
            }
            else
            {
                return "No Write.";
            }
            postStream.Close();
            return "Succefull";
        }
        catch (Exception ex)
        {
            return "Error:" + ex.Message;
        }
当我上传30多兆的文件时可以上传成功,但是上传100多兆的资源时就会报错:Internet Explorer 无法显示该网页,上面这段代码应该怎么用啊?

解决方案 »

  1.   

    把webconfig里的限制改到最大试试
      

  2.   

    修改webconfig不是解决问题的根本办法,webconfig总是有上限的,在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改WEB.Config文件来自定义最大文件大小,如下:<httpRuntime executionTimeout="300" maxRequestLength="40960" useFullyQualifiedRedirectUrl="false"/>这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理。解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。实现方法就是上面我贴的代码,但是我不知道该如何用这段代码。
      

  3.   

    楼主看看我的贴子,好多牛人
    http://topic.csdn.net/u/20100928/17/7c1e409c-6219-4b13-81e1-8ff1e0534ac2.html
      

  4.   

    网上有其它的方法 Brettle.Web.NeatUpload.dll
      

  5.   

    maxRequestLength最大可以为 2097151 也就是2G
    另外,楼上找到的
    “解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。。”
    确实是很好的办法,不过这里只是写了一小小部分的代码,只提供了一个思路,楼主到网上仔细找,有完整的例子。代码还是挺多的。
    搜一下 WebbUpload 
    这是某高手写的例子,不错的。
      

  6.   

    webclient 走http 
    用WebCLient也可能会造成内存泄露,
    webclient和ftp都可以用来做大文件上传, 做好分块和断点。
      

  7.   

    我们公司是用的第三方ActiveX控件来做的。因为大文件上传需要支持断点续传操作。比如300MB这样的文件在公网传的话传统的ASP.NET方法肯定没办法传。Flash控件又不支持断点续传控件。如果传大文件的话不适合。
    文件MD5值计算进度:文件MD5值计算完毕文件上传中文件上传完毕
      

  8.   

    基本上大家都是用的控件来做的。普通的方式根本没办法做。Flash也不行,现在网上还没有支持断点续传的Flash控件。
    比如QQ邮箱中的大文件上传控件是ActiveX开发的,115网络硬盘也是用ActiveX开发的。华为网盘(DBank)也是用ActiveX开发的。另外如果要做秒传功能的话需要控件实现计算文件MD5值的功能。
    网上到是有一个控件。http://www.cnblogs.com/xproer/archive/2012/02/17/2355440.html
      

  9.   

    我们公司的OA产品是用的Xproer.HttpUploader3这个控件来实现的大文件断点续传功能。楼主可以在网上搜一下。有详细的介绍和使用说明。总体感觉不错。
      

  10.   

    开始我们也是用的Flash控件,但是后来在公网上面使用时出了许多问题,主要是如果有许多用户同时上传文件的话,服务器的CPU和内存都会占用比较高。如果上传大文件的话,基本失败,因为一个用户上传500MB文件,十个用户同时上传500MB文件的话,那就占5G内存,我们服务器才4G。后来换了ActiveX控件。使用的是分块上传技术,这样才降低了服务器的内存占用。每次控件只向服务器上传128KB的数据。而且控件还支持文件MD5计算功能,这样我们就能够识别用户要上传的文件在服务器中是不是存在相同的。