探讨一下上传控件的上载文件大小限制的问题
在页面中用了一个
<form id="Form1" method="post" encType="multipart/form-data" runat="server">
<input type="file" runat="server" />
<asp:button id="button1" runat="server" />
</form>
当你上传一个文件,它的体积超过
web.config中的maxRequestLength值,程序会报dns错误.无法显示该页.
我们就想通过判断PostedFile.ContentLength的值来确定它是否在我们允许的范围内,但是只要你上传的文件超过maxRequestLength值时,PostedFile.ContentLength还来不及判断,程序就已经报错了.
我想过很多方法,包括自定义验证控件,以及通过客户端脚本vbscript或javascript,来验证,好像都没有找到没有好的解决方案.不知道CSDN的高手,有没有什么好的方法.望赐教.
问题点数:20、回复次数:39Top
1 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-16 12:33:38 得分 0
vbcrlfTop
2 楼ChengKing((.net: http://blog.csdn.net/ChengKing ))回复于 2005-09-16 13:08:49 得分 0
<system.web>
<httpRuntime executionTimeout="600" maxRequestLength="51200" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true"/>
</system.web>
Top
3 楼net_lover(【孟子E章】)回复于 2005-09-16 13:10:41 得分 0
在保存文件时,您应该确保指定文件的完整路径(例如,"C:\MyFiles\Picture.jpg"),并确保为 ASP.NET 使用的帐户提供要存储文件的目录的写权限。上载大文件时,可使用 元素的 maxRequestLength 属性来增加文件大小的最大允许值,例如:
<configuration>
<system.web>
<httpRuntime maxRequestLength="1048576" executionTimeout="3600" />
</system.web>
</configuration>
其中:maxRequestLength:指示 ASP.NET 支持的HTTP方式上载的最大字节数。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。executionTimeout:指示在被 ASP.NET 自动关闭前,允许执行请求的最大秒数。在当文件超出指定的大小时,如果浏览器中会产生 DNS 错误或者出现服务不可得到的情况,也请修改以上的配置,把配置数加大。
另外,上载大文件时,还可能会收到以下错误信息:
aspnet_wp.exe (PID: 1520) 被回收,因为内存消耗超过了 460 MB(可用 RAM 的百分之 60)。
如果遇到此错误信息,请增加应用程序的 Web.config 文件的 元素中 memoryLimit 属性的值。例如:
<configuration>
<system.web>
<processModel memoryLimit="80"/>
</system.web>
</configuration>
Top
4 楼net_lover(【孟子E章】)回复于 2005-09-16 13:12:47 得分 0
2003系统还需要修改System32\Metabase.xml文件Top
5 楼net_lover(【孟子E章】)回复于 2005-09-16 13:13:21 得分 0
2003系统还需要修改System32\Metabase.xml文件Top
6 楼hchxxzx(NET?摸到一点门槛)回复于 2005-09-16 13:15:48 得分 0
你不能使用webconfig里面的上限值来限制所能上传的最大文件值。这个判断应将它放在代码里面。
假设你把maxRequestLength值设置大一点比如1000M(不过这个最大值是跟你服务器的内存有关系的),然后在代码里面,根据情况的不同,比如当超过300M的时候,弹出提示。
Top
7 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-16 13:25:22 得分 0
感谢几位高手的答复,非常感谢.
不过,好像几位高手没有仔细看清楚我的问题.
我的web.config配置
<httpRuntime maxRequestLength="1024" executionTimeout="45" />
我的意思是.如果想判断
sub button_click()
if cint(file1.PostedFile.ContentLength) >1024*1024 then
registerclientscriptblock("error","<script>不写了</script>"
end if
end sub
实际上,如果你上载一个大于1024KB的话,程序就直接报无法显示的错误了,上面的按钮事件根本不起作用.
Top
8 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-16 13:27:26 得分 0
希望大家继续关注,上网google了一下,也找不到什么好的解决方法.
我想过用vbscript以及javascript只是无奈这两种都不是太精通.
vbscript好像没有判断上传文件大小的方法Top
9 楼dbserver(寻找完美的自我)回复于 2005-09-16 13:54:03 得分 0
后台代码能查看到文件大小!
---------------
欢迊来到麦高网-私活兼职首选平台 www.mgao.net
Top
10 楼apcsherry(无敌神勇小超人)回复于 2005-09-16 13:55:37 得分 0
<system.web>
<httpRuntime executionTimeout="600" maxRequestLength="51200" useFullyQualifiedRedirectUrl="false" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100" enableVersionHeader="true"/>
</system.web>
Top
11 楼fox7805034(肚子饿了)回复于 2005-09-16 14:07:23 得分 0
我补充句...用.net自带的上传组件不能超过单个文件200mTop
12 楼smile9961(good life)回复于 2005-09-16 14:07:45 得分 0
ContentLength 可以的啊,我用下面的代碼:
Dim Xsize As Integer = File1.PostedFile.ContentLength / 1024 / 1024
If Xsize > 2 Then '不可以超過2M
Response.Write("<script>alert('error');</script>")
Return
End IfTop
13 楼smile9961(good life)回复于 2005-09-16 14:20:25 得分 0
不好意思,說錯了,因爲我的文件小於默認值4M,所以沒有報錯.但大於4M就顯示DSN錯誤.
Top
14 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-16 22:18:01 得分 0
smile9961
看到你的第一篇时,我就想说了,没有想到,你很快就反应过来了.
无论你怎么判断,但实际上你故意上传一个大于配置文件中的限制大小的文件时,肯定报dns错误.
且application_error也捕捉不到.
apcsherry
这位朋友把maxRequestLength设置得太大,毫无意义可言.
maxRequestLength,指示 ASP.NET 支持的最大文件上载大小。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB)。
把这个值设得超大,还是有可能导致拒绝服务攻击!
请继续关注!谢谢各位.Top
15 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2005-09-16 22:45:12 得分 0
web.config是最先执行的。
你只能想办法在客户端判断文件的体积了。
Top
16 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-17 09:00:56 得分 0
问题就是如何用javascript来和vbscript来判断。Top
17 楼luxuehong()回复于 2005-09-17 09:14:56 得分 0
UPTop
18 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2005-09-17 10:59:17 得分 10
终于找到方法了:
document.all.imgID.fileSize 单位是字节。
用这个就可以了。我已经测试通过了。IE6.0
window.setTimeout(showpic1,800);
用这个的原因是,图片加载到image后,需要过一点点时间后,才能取到当前图片的信息,否则得到的可能是上一个图片的信息。
<HTML>
<HEAD>
<title>上传文件测试</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
<script language=javascript>
function showpic1()
{
var img = document.getElementById("img_upload");
var lbl = document.getElementById("lbl_title");
lbl.innerText = "宽度:" +img.width + "高度:" + img.height + "。size:" + img.fileSize + "B";
}
function showpic(me)
{
//alert(me.value);
var img = document.getElementById("img_upload");
var lbl = document.getElementById("lbl_title");
img.src = me.value;
lbl.innerText = "请稍候......";
window.setTimeout(showpic1,800);
}
</script>
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<TABLE id="Table1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" cellSpacing="1"
cellPadding="1" width="300" border="1">
<TR>
<TD></TD>
<TD><div id="lbl_title"></div></TD>
<TD></TD>
</TR><TR>
<TD></TD>
<TD><IMG id="img_upload" alt="" src=""></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD><INPUT id="file_upload" type="file" onchange="showpic(this)"></TD>
<TD></TD>
</TR>
</TABLE>
</form>
</body>
</HTML>Top
19 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-17 11:14:11 得分 0
非常感谢 jyk(喜欢编程。和气生财。共同提高。共同进步) 的回复.
您的代码,我已经测试过了,很好用.
但是我的宗旨还是没有实现.
我的本意是:如果客户端上载了一个超过web.config中的设置的最大时,程序是会报dns错误的.
我要解决的就是无论客户端上载多大的文件,程序都不应该报dns错误.
而application_error是捕捉不到这种错误的.
如果仅用javascript做客户端的判断的话,有一个问题就是客户端可以绕过脚本验证.
我的想法是,页面上放一个自定义的验证控件,通过javascript返回一个args.isvalid=false
传递给自定义的验证控件,重而让page.isvalid=false,页不报dns错误.
能不能再麻烦你改写一下如果客户端上载的文件大于某值时,执行一个alert("")
非常感谢.Top
20 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-17 11:16:47 得分 0
请大家继续关注一下.谢谢Top
21 楼smile9961(good life)回复于 2005-09-17 11:57:55 得分 0
...defaultRedirect="errorpage.htm" 也不行,继续关注!Top
22 楼ivee(ivee)回复于 2005-09-17 12:08:31 得分 0
MS的网站上有一句话:“...您无法显示自定义错误。”,这个“无法”是不是就是“不可能”的意思??
不过有个MVP的BLOG,你可以参考一下,不知道有没有用:
http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspxTop
23 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-17 12:53:40 得分 0
多谢大家的关注!!非常感谢。希望各位群策群力,找到一个好的解决方法。Top
24 楼jyk(今天由我来写的代码,明天就让程序自己完成!喜欢编程。和气生财。共同提高。共同进步!)回复于 2005-09-17 16:18:29 得分 0
晕了,已经在客户端得到了文件的体积了,判断一下是否超过了限制就行了。
你说的绕过js的验证而出现的错误的情况,是可以不予考虑的。
只要在正常情况下,不出错就行了。
在“做手脚”的情况下出错了也没有办法。
刚刚在firefox下试了一下,遗憾,没有反应。Top
25 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-17 17:23:18 得分 0
你的程序是可以用的啊.我正在做一些修改.但是现在还是有一点小问题.
我不太熟悉javascript,遗憾啊.Top
26 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-17 20:13:38 得分 0
其它朋友还有什么更好的建议吗?Top
27 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-09-28 08:31:49 得分 0
看来这个问题只能依赖2.0能够解决了。Top
28 楼tuzuodong(不放弃我追求)回复于 2005-09-28 09:52:22 得分 0
fox7805034(肚子饿了) 这位兄弟说的,不能超过200MB,我试过也是这种情况,maxrequeslength 你设置得再大,也不会超过200MB,不知还有什么好的方法可以突破呢?不知楼主不否将上传文件保存到本机 ,如果放到服务器上的另一部机上,保存路径及权限该怎样写?Top
29 楼hchxxzx(NET?摸到一点门槛)回复于 2005-10-10 23:41:44 得分 10
可以超过200M
所能上传文件的最大限度,跟以下几个方面有关系
1.服务器的内存大小(当内存不大于2G情况下)
2.web.config中的上传限定大小
3.C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config文件内memoryLimit设定
想要上传更大文件的方法
1.增大服务器的内存,在第2点未修改条件下,如果有2G内存,估计即可上传600M
2.设置web.config里面的上传最大值,比如设置到2000M(2000000)
3.将memoryLimit默认的60,修改为100以下(比如90),如此,系统将会把你的服务器所有内存的90%全部拿来以供上传。经过以上设置,估计可上传900M文件。
如果内存超过2G,由于操作系统正常能使用的内存大小上限为2G,此时应用一些特殊的办法,能够让系统使用更多的内存,如果能做到此点,那么,可以上传更大的文件。
根据粗略的估计,上传1M的文件,需要使用服务器2M的内存,可大致按照这个比例来计算。
我已成功尝试过上传最大350M大小的文件Top
30 楼smin1994(smin1994)回复于 2005-10-11 09:01:15 得分 0
不错的帖子Top
31 楼byyt(KingCobra)回复于 2005-10-11 09:11:39 得分 0
好帖!Top
32 楼eyych(2006)回复于 2005-10-11 09:21:31 得分 0
不设置
web.config中的maxRequestLength值
直接通过
PostedFile.ContentLength
判断即可。。。。Top
33 楼Bye1980(四月·来也勿勿·去也冲冲)回复于 2005-10-11 14:45:37 得分 0
好帖!
Top
34 楼truelove12(结贴者寥寥无几,心寒ing...)回复于 2005-10-24 15:36:30 得分 0
eyych,你没有看清楚上面的问题,当你超过web.config中的maxRequestLength时,程序就会报dns错误了,你的那个段是不会执行的。因为此时,应用已经崩溃。
首先先感谢楼上若干朋友的答复。
但是最关键的问题还是没有解决。即在上传超过web.config中的maxRequestLength时,程序应该在有所有提示,并禁止上传,这才是最终应该实现的。
感谢各位关注!Top
35 楼hchxxzx(NET?摸到一点门槛)回复于 2005-10-24 20:07:56 得分 0
但是最关键的问题还是没有解决。即在上传超过web.config中的maxRequestLength时,程序应该在有所有提示,并禁止上传,这才是最终应该实现的。
--------------------------------
你可尝试修改C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG\machine.config文件内memoryLimit设定,在默认情况下,该值为60,表示将使用你服务器的60%的内存资源进行上传,因此,一旦超出上传上限,则系统将自动清除内存中的数据,所以不报错。假设你把它修改为超过100,比如150%,那么,上传动作将自动进行下去,并且不会报错,但服务器将会耗尽资源,有可能会引起死机。
Top
36 楼ligaru(为了生活重新学C++)回复于 2005-11-22 08:58:53 得分 0
学习Top
37 楼leagenary(lee)回复于 2005-11-22 10:16:07 得分 0
markTop
38 楼bytesoon(lt)回复于 2005-11-22 10:29:26 得分 0
脚本在客户端是不能访问文件的
可以做个插件
------------------------------------
我的团队:www.51team.com
欢迎访问,有志者共谋事,每天都有惊喜,SOHOTop
39 楼ipqxiang(Seans)回复于 2006-01-11 11:47:01 得分 0
下载有没有设置大小限制的,我就碰到这种情况,如何解决?!Top




