如何验证文件上传的文件类型?

时间:2020-03-05 18:55:50  来源:igfitidea点击:

我正在使用<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>

允许上传的文件类型的客户端验证