如何验证文件上传的文件类型?
我正在使用<input type =" file" id =" fileUpload" runat =" server">`在ASP.NET应用程序中上传文件。我想限制上传的文件类型(例如:限制为.xls或者.xlsx文件扩展名)。
JavaScript或者服务器端验证都是可以的(只要在文件上传之前进行服务器端验证,就可以上传一些非常大的文件,因此任何验证都需要在实际文件上传之前进行)。
解决方案
回答
那么,我们将无法在服务器端进行回发,因为文件将在回发期间提交(上传)。
我认为我们可以使用JavaScript在客户端上执行此操作。我个人使用的是Telerik的名为radUpload的第三方组件。它具有良好的客户端和服务器端API,并且为大文件上传提供了进度条。
我确定也有开放源代码解决方案。
回答
我们唯一的选择似乎是客户端验证,因为服务器端意味着文件已经上传。另外,MIME类型通常由文件扩展名决定。
使用jQuery之类的JavaScript框架来重载表单的onsubmit事件。然后检查扩展名。这将限制大多数尝试。但是,如果有人将图像更改为扩展名XLS,那么我们将遇到问题。
我不知道这是否适合我们,但是使用Silverlight或者Flash上载时,我们拥有更多的客户端控制权。我们可以考虑在上传过程中使用其中一种技术。
回答
从javascript,我们应该能够在onsubmit处理程序中获取文件名。因此,在情况下,我们应该执行以下操作:
<form onsubmit="if (document.getElementById('fileUpload').value.match(/xls$/) || document.getElementById('fileUpload').value.match(/xlsx$/)) { alert ('Bad file type') ; return false; } else { return true; }">...</form>
回答
我们可以在上传控件上使用正则表达式验证器:
<asp:RegularExpressionValidator id="FileUpLoadValidator" runat="server" ErrorMessage="Upload Excel files only." ValidationExpression="^(([a-zA-Z]:)|(\{2}\w+)$?)(\(\w[\w].*))(.xls|.XLS|.xlsx|.XLSX)$" ControlToValidate="fileUpload"> </asp:RegularExpressionValidator>
输入标签还具有accept属性:
<input type="file" accept="application/msexcel" id="fileUpload" runat="server">
但是当我尝试使用FF3和IE7时,我并没有获得太大的成功
回答
我认为有不同的方法可以做到这一点。由于我不熟悉asp,因此我只能为我们提供一些检查特定文件类型的提示:
1)安全的方法:获取有关我们希望传递的文件类型的标头的更多信息。解析上传的文件并比较标题
2)快速方法:将文件名分为两部分->文件名和文件结尾。检查文件的结尾并将其与我们要允许上传的文件类型进行比较
希望能帮助到你 :)
回答
似乎我们选择的选项有限,因为我们希望在上传之前进行检查。我认为最好的方法是使用JavaScript来验证文件的扩展名。我们可以构建有效扩展名的哈希,然后查看哈希中是否存在要上传的文件的扩展名。
HTML:
<input type="file" name="FILENAME" size="20" onchange="check_extension(this.value,"upload");"/> <input type="submit" id="upload" name="upload" value="Attach" disabled="disabled" />
Javascript:
var hash = { 'xls' : 1, 'xlsx' : 1, }; function check_extension(filename,submitId) { var re = /\..+$/; var ext = filename.match(re); var submitEl = document.getElementById(submitId); if (hash[ext]) { submitEl.disabled = false; return true; } else { alert("Invalid filename, please select another file"); submitEl.disabled = true; return false; } }
回答
避免使用标准的Asp.Net控件,而使用Brettle Development的NeadUpload组件:http://www.brettle.com/neatupload
更快,更易于使用,无需担心配置文件中的maxRequestLength参数,并且非常易于集成。
回答
正如某些人所提到的,JavaScript是必经之路。请记住,此处的"验证"仅是文件扩展名,它不会验证文件是否是真正的Excel电子表格!
回答
我同意Chris的看法,我们以任何方式查看扩展名都不是对文件类型的验证。 Telerik的radUpload可能是我们最好的选择,它提供了要上传文件的ContentType属性,我们可以将其与已知的mime类型进行比较。我们应该检查:
application / vnd.ms-excel,
应用程序/ excel,
应用程序/ x-msexcel
对于新的2k7格式:
application / vnd.openxmlformatsofficedocument.spreadsheetml.sheet
Telerik以前将radUpload作为一个单独的组件出售,但是现在将其包装到控件套件中,这使其价格更高一些,但到目前为止,这是检查真实类型的最简单方法
回答
确保始终在服务器端检查文件扩展名,以确保没有人可以上载.aspx,.asp等恶意文件。
回答
作为一种替代选择,我们是否可以使用HTML File Input的" accept"属性来定义可接受的MIME类型。
这里的定义
回答
使用正则表达式验证器非常简单。
<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Only zip file is allowed!" ValidationExpression ="^.+(.zip|.ZIP)$" ControlToValidate="FileUpload1" > </asp:RegularExpressionValidator>
允许上传的文件类型的客户端验证