首页 新闻 会员 周边

限制上传文件大小

4
悬赏园豆:15 [已解决问题] 解决于 2011-11-16 14:54

目前有上传文件的功能,使用.net的uploadfile控件直接做的。录入附件大小限制为10M,

if (FileUpload1.PostedFile.ContentLength > 10485760)

,但是需要上传到服务器之后才判断是否超过限制,假如用户上传的附件较大的话,上传完了才提示用户体验就不好了。请问各位对于文件上传以及限制一般是怎样处理的呢?或者是使用什么其他的组件呢?

敬YES的主页 敬YES | 菜鸟二级 | 园豆:490
提问于:2011-11-11 11:03
< >
分享
最佳答案
0

客户端Javascript没有权限获取文件大小的。

除了那个activeX外。 不过那个也不算好办法

 

一般是用flash或者Silverlight来做。

 

特例就是, IE6下有bug, 

IMG对象的dynsrc是可以指向本地文件, 并且获取文件长度的。

不过这个局限性太大

除非你们做内网项目并且客户刚好是用IE6并且不打算升级。

 

你可以朝flash方向努力

有很多开源的控件的

甚至还有一个jquery插件。 不过最后也是用的一个flash来搞定的。

你可以搜下。

收获园豆:9
undefined | 小虾三级 |园豆:898 | 2011-11-14 20:50
其他回答(7)
1

试试这个组件:NeatUpload

收获园豆:1
dudu | 园豆:31007 (高人七级) | 2011-11-11 11:24

谢谢dudu站长。我测试了一下,NeatUpload是上传效果挺好,还有进度条呢。不过他能实现在上传前检测文件大小吗?

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2011-11-11 18:04

@丫头小静(Cathy): 不好意思,我没在实际项目中使用过。

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2011-11-11 18:39
0

不会吧。你可以先判断,后上传啊。

悟行 | 园豆:12559 (专家六级) | 2011-11-11 12:10

您能说具体点嘛?怎么先判断呢?用js吗?

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2011-11-11 18:04
0
收获园豆:2
喬喬AI | 园豆:996 (小虾三级) | 2011-11-11 17:57

谢谢,不过我好想没看出来最终的方案是什么

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2011-11-11 18:04

@丫头小静(Cathy): 第一种方法:上传之前判断

C# code
HttpPostedFile hf = Request.Files[0];//取得控件if (hf.ContentLength >0)//是否有图片 { int fileSize =0; fileSize = hf.ContentLength;//取得大小if (fileSize <2097152)//判断大小 单位字节 { } else { MessageBox.Show(this.Page, "图片大小不能超过2M"); return; } }
支持(0) 反对(0) 喬喬AI | 园豆:996 (小虾三级) | 2011-11-11 18:06

@张小线:

你好,我试了一下这种方式,确实可以验证。

不过我用200M文件测试的时候发现还是挺慢的,他应该也是先传上去在验证的吧?

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2011-11-14 17:02
0

可以通过在Web.config中设置上传文件的大小,并且在上传之前做验证就可以了:

web.config配制:

<system.web>

<!--修改要上传文件的大小-->
<httpRuntime maxRequestLength="102400" executionTimeout="600" appRequestQueueLimit="1000"/>

</system.web>

上传之前做验证:

if (this.FileUpload1.PostedFile.ContentLength > 1024 * 1024 * 10)
{

       //上传文件的大小超过了10M.

}

else

{

//上传文件

}

KivenRo | 园豆:1734 (小虾三级) | 2011-11-12 06:11

你好,上传大文件已经配置过了。也是用的this.FileUpload1.PostedFile.ContentLength 这宗判断方法,可是这种方法好像也是等文件上传上去之后才检测出来的,你上传个几百兆的大文件,就会发现等了好久才会提示。

支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2011-11-14 14:02

嗯,文件太大的话,是有点慢了。。。

你用下面这个脚本可以很快的获取上传文件的大小:

function getFileSize(filePath) {
      var fso = new ActiveXObject("Scripting.FileSystemObject");
      alert("文件大小为:" + fso.GetFile(filePath).size);//这里是弹出的,可以保存到控件在页面显示

<input type="file" onchange="getFileSize(this.value);"/>

可以把获取到的值保存到一个label里显示出来,再去进行比较。。。

我想这样应该会快一点了吧

支持(0) 反对(0) KivenRo | 园豆:1734 (小虾三级) | 2011-11-14 14:44

@白雲天: 

这个我刚才也试了,可是会有安全提示,估计还是过不了关

<html>
<head>
<script>

function getFileSize(fileName) {
if (document.all) {
window.oldOnError
= window.onerror;
window.onerror
=function (err) {
if (err.indexOf('utomation') !=-1) {
alert(
'没有访问文件的权限');
returntrue;
}
else
returnfalse;
};
var fso =new ActiveXObject('Scripting.FileSystemObject');
var file = fso.GetFile(fileName);
window.onerror
= window.oldOnError;
return parseInt(file.Size /1024) +'K';
}
}
</script>
</head>
<body>
<form name="formName">
<input type="file" name="fileName" onchange="alert(getFileSize(this.form.fileName.value))"><br>
</form>
</body>
</html>



支持(0) 反对(0) 敬YES | 园豆:490 (菜鸟二级) | 2011-11-14 17:43

嗯,看来要找找其它方法了。看看能不能用带进度条的上传控件,这样虽然有时候也会很慢,但对于客户体验来说还是好一些的。。。比如:fileuploadify

支持(0) 反对(0) KivenRo | 园豆:1734 (小虾三级) | 2011-11-14 21:28
0

 fso.GetFile(filePath).size:

可以顺着这个自己去实现呀。。activeX控件这个东西。。。

小AI | 园豆:354 (菜鸟二级) | 2011-11-14 18:53
0

你可以试试jq插件uploadify.也是采用了flash.

收获园豆:1
loi | 园豆:191 (初学一级) | 2011-11-14 22:23
0

uploadify++

收获园豆:2
码尔代夫iimax | 园豆:3138 (老鸟四级) | 2011-11-15 12:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册