这是我在网上查到了:
第一部分:
首先我们来说一下如何解决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 无法显示该网页,上面这段代码应该怎么用啊?
第一部分:
首先我们来说一下如何解决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 无法显示该网页,上面这段代码应该怎么用啊?
解决方案 »
- GridView 编辑模式时想要实现的功能
- cache中同时具备到期时间和时间间隔的时候会不会冲突??????
- 对不起,只有这点分了,VS2005,获取客户端显示分辨率的问题
- 我希望控制文字大小,就是不希望用户通过view--text size--
- 再次讨论关于C#中的static问题!
- GridView分页传递参数问题
- Response.Redirect传递参数出错,先谢了
- 我将DataGrid标题字段的Wrap属性设为false以后,就不能控制它的宽度了吗?
- 大家帮我看一下,我的“删除”操作为何实现不了,代码已经贴上,烦请帮我看看!
- 奇怪的问题????
- 一段代码
- XP SP3系统装完ORACLE 92 后发现VS2005设计视图里的控件都不显示了?
http://topic.csdn.net/u/20100928/17/7c1e409c-6219-4b13-81e1-8ff1e0534ac2.html
另外,楼上找到的
“解决的方法是利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。。”
确实是很好的办法,不过这里只是写了一小小部分的代码,只提供了一个思路,楼主到网上仔细找,有完整的例子。代码还是挺多的。
搜一下 WebbUpload
这是某高手写的例子,不错的。
用WebCLient也可能会造成内存泄露,
webclient和ftp都可以用来做大文件上传, 做好分块和断点。
文件MD5值计算进度:文件MD5值计算完毕文件上传中文件上传完毕
比如QQ邮箱中的大文件上传控件是ActiveX开发的,115网络硬盘也是用ActiveX开发的。华为网盘(DBank)也是用ActiveX开发的。另外如果要做秒传功能的话需要控件实现计算文件MD5值的功能。
网上到是有一个控件。http://www.cnblogs.com/xproer/archive/2012/02/17/2355440.html