关于文件上传,判断大小的问题

encienqi 2009-03-01 10:02:24
问题描述:
我已经在web.config中加入了如下语句,(把允许的上传大小设为10G)
<httpRuntime executionTimeout="90" maxRequestLength="1048576" useFullyQualifiedRedirectUrl="false"
minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100"/>
在上传按钮的事件中写如下语句,限定上传大小不能超过10M。
string str = this.fileloa.PostedFile.FileName;
FileInfo fileInfo = new FileInfo(str); //获取文件信息
long fileSize = (fileInfo.Length / 1024) / 1024; //获取文件大小
if (fileSize > 10) //控制文件大小不能超过10M
{
this.RegisterStartupScript("s1", " <script language='javascript'>alert('文件大小不能超过10M !') </script>");
return; //不能继续执行
}
现在的问题是,如果我选一个800M甚至更大的文件,然后点上传按钮时,好像文件在一点点上传,总之要等好久,IE的网页进度条一点点往前走,直到进度条走满后,才弹出对话框,说“文件大小不能超过10M !”,怎样能一开始就判断大小,不用等那么久。
...全文
517 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
encienqi 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 Janway 的回复:]
你可以调试下GetFileSize函数是否正常执行了:在函数的if语句前加一句:alert(fileSize);,看看这个值是多少
只要选择了文件,就应该跳出窗口
[/Quote]
没有呀,我选文件后,没有任何反应~怎会事呢?
Janway 2009-03-01
  • 打赏
  • 举报
回复
你可以调试下GetFileSize函数是否正常执行了:在函数的if语句前加一句:alert(fileSize);,看看这个值是多少
只要选择了文件,就应该跳出窗口
encienqi 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 Janway 的回复:]
晕!
肯定是GetFileSize函数没执行。
GetFileSize函数是否写在了aspx页面的 <head> </head>之间?要把函数写在这里。
[/Quote]
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript">
function GetFileSize(filePath) {
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
if (fileSize >10000) //根据你的要求修改这个值
{
alert("文件太大了点吧!");
return false;
}
else
{
return true;
}
}
</script>
<link href="css/myown.css" rel="stylesheet" type="text/css" />
</head>
Janway 2009-03-01
  • 打赏
  • 举报
回复
晕!
肯定是GetFileSize函数没执行。
GetFileSize函数是否写在了aspx页面的<head></head>之间?要把函数写在这里。
encienqi 2009-03-01
  • 打赏
  • 举报
回复
还是直接蹦出'LOA文件大小不能超过10M !,而没有弹出JS中的那句,好像没有执行那个
encienqi 2009-03-01
  • 打赏
  • 举报
回复
拿出来了也还是等好久呀~~
protected void Page_Load(object sender, EventArgs e)
{
fileloa.Attributes.Add("onchange", "return GetFileSize(this.value);");
if (!IsPostBack)
{
GridLoaBind();
}
}
是不是其他地方需要改?
Janway 2009-03-01
  • 打赏
  • 举报
回复
把onchange绑定语句从 IsPostBack判断中拿出来就好了。
protected void Page_Load(object sender, EventArgs e)
{
fileloa.Attributes.Add("onchange", "return GetFileSize(this.value);");
if (!IsPostBack)
{
GridLoaBind();
}
}
Janway 2009-03-01
  • 打赏
  • 举报
回复
likevs说的没错,所谓上传当然是先传到服务器内存中,除非代码中有明确的save代码,这个文件并未真的写入到硬盘上。但这是很糟糕的,谁的服务器也不会搞那么大内存来容忍这种情况!事先判断文件大小是明智的。
encienqi 2009-03-01
  • 打赏
  • 举报
回复
<script type="text/javascript">
function GetFileSize(filePath) {
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
if (fileSize >10000) //根据你的要求修改这个值
{
alert("文件太大了点吧!");
return false;
}
else
{
return true;
}
}
</script>
cs里
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
fileloa.Attributes.Add("onchange", "return GetFileSize(this.value);");
GridLoaBind();
}
}
对吗?为何还是不管用?按钮事件里用改什么吗?
Janway 2009-03-01
  • 打赏
  • 举报
回复
注意这里:onchange="return GetFileSize(this.value)"
一定要有return,并且判断函数里,如果文件不符合要求,一定要返回false!
否则虽然执行了判断函数,但不论是否符合要求,文件都会继续上传。
likevs 2009-03-01
  • 打赏
  • 举报
回复
首先,我暂时没看出楼主的代码错在哪

据我以前的经验,应该是内存问题,

以前我在本地机子测试时,把1G东西从1区传到2区,都没问题,可后来,安装到服务器上时,发现一旦文件太大,就会出现你说的这种情况.


后来一网友说是内存问题,就是说:

FileInfo fileInfo = new FileInfo(str); //获取文件信息
long fileSize = (fileInfo.Length / 1024) / 1024; //获取文件大小

这个代码,你要计算文件的长度,那么你的内存里必须先完全装载这800MB或超过1G容量大小的东西,

可能自己的机子本身已打开好多软件进程,还有系统进程等,占用了一部分内存,结果4G(1G内存+3G虚拟内存)都用得差不多去,这时有可能出点小错误.

当然,我目前是这么认为的,仅供参考
encienqi 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 Janway 的回复:]
对了,这个函数还不能干什么,你还没利用fileSize来判断客户端文件,再改造下上面的代码:
aspx页面:
<script type="text/javascript">
function GetFileSize(filePath) {
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
if (fileSize >10000) //根据你的要求修改这个值
{ alert(“文件太大了点吧!”);
ret…
[/Quote]
我按这样写了,为何还是等他上传呢?不是马上就弹出对话框。
Janway 2009-03-01
  • 打赏
  • 举报
回复
哈,着急中我上面的javascript还是落下了}和{,你自己加上吧。
Janway 2009-03-01
  • 打赏
  • 举报
回复
对了,这个函数还不能干什么,你还没利用fileSize来判断客户端文件,再改造下上面的代码:
aspx页面:
<script type="text/javascript">
function GetFileSize(filePath) {
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
if (fileSize >10000) //根据你的要求修改这个值
{ alert(“文件太大了点吧!”);
return false;
else
return true;
}
</script>

后台代码:
fileloa.Attributes.Add("onchange", "return GetFileSize(this.value);")

这样如果文件太大就提示客户,并且系统什么也不做,否则就继续执行服务端代码(也就是继续完成上传,执行上面你写的那些代码)

Janway 2009-03-01
  • 打赏
  • 举报
回复
前面函数增加一个参数:
<script type="text/javascript">
function GetFileSize(filePath) {
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
}
</script>

上传控件这样写:
<asp:FileUpload ID="fileloa" runat="server" onchange="GetFileSize(this.value)"/>
虽然在控件中这样写没有错,但vs会提示不符合xhtml规范。
你可以在页面load中这样写:
fileloa.Attributes.Add("onchange", "GetFileSize(this.value)")
效果一样,还能通过xhtml检查。
encienqi 2009-03-01
  • 打赏
  • 举报
回复
前面这样写
<script type="text/javascript">
function GetFileSize() {
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
}
</script>
上传控件这样写
<asp:FileUpload ID="fileloa" runat="server" onchange="GetFileSize()"/>
这个函数只需要一个参数值就是文件名。
我应该怎样写呢?能否帮我改下这个?谢谢了!!
Janway 2009-03-01
  • 打赏
  • 举报
回复
你可以测试下,我是很久以前遇到过和你同样的问题并找到这个解决办法,当时对于rar、doc等文件的大小判断是不准确的。因为当时的要求是只传图片,我也就没再深研究。
如果文件是恶意改名的,比如把rar文件改后缀为jpg,那么image.fileSize永远等于1,也就是说非图片文件,这是个简单的判断方法!
encienqi 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 Janway 的回复:]
用fileUpload控件,的确是只能先上传后才能判断文件大小,而无法事先判断。你的语句没有问题。
如果想实现上传前就判断文件大小,不符合要求的则拒绝上传,得使用javascript。
第一想法是用FSO,不过肯定是行不通的,用javascript来操作客户端文件早就因为安全问题被否决掉了。
那只有一个办法就是用img对象来判断,这个办法很有效,但也有个缺陷就是上传文件的格式只能是图片或流媒体,如mp3、avi、rm等,如果是别的文件,…
[/Quote]
那如果是doc等文件,比如有人恶意把很大的文件改为。doc的,这样能准确的判断大小吗?
Janway 2009-03-01
  • 打赏
  • 举报
回复
按我上面的方法可以立即判断文件大小,而不用等很久(也就是不用等上传完了才判断)。
Janway 2009-03-01
  • 打赏
  • 举报
回复
用fileUpload控件,的确是只能先上传后才能判断文件大小,而无法事先判断。你的语句没有问题。
如果想实现上传前就判断文件大小,不符合要求的则拒绝上传,得使用javascript。
第一想法是用FSO,不过肯定是行不通的,用javascript来操作客户端文件早就因为安全问题被否决掉了。
那只有一个办法就是用img对象来判断,这个办法很有效,但也有个缺陷就是上传文件的格式只能是图片或流媒体,如mp3、avi、rm等,如果是别的文件,比如RAR可能判断的就不准了。
用javascript判断文件大小的关键代码:
var image = new Image();
image.dynsrc = filePath;
var fileSize = image.fileSize;
这里的fileSize就是要上传的文件大小了!代码也不是很多,呵呵。如果想更多了解<img>的dynsro属性,可也曲查一下xhtml手册。
要想上传前对文件大小进行判断,在.net里还得为fileUpload增加onchange事件。把上面的代码写成一个函数,然后onchange呼叫这个函数处理,这个函数只需要一个参数值就是文件名。
加载更多回复(17)

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧