日期:2014-05-18  浏览次数:20449 次

如何上传大文件啊?
这是我在网上查到了:
第一部分:
    首先我们来说一下如何解决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里分块读取数据。实现方法如下:
C# code
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上传文件的,代码如下:
C# code
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 无法显示该网页,上面这段代码应该怎么用啊?

------解决方案--------------------
楼主看看我的贴子,好多牛人。。。
http://topic.csdn.net/u/20100928/17/7c1e409c-6219-4b13-81e1-8ff1e0534ac2.html
------解决方案--------------------
webclient 走http 
用WebCLient也可能会造成内存泄露,
webclient和ftp都可以用来做大文件上传, 做好分块和断点。