关于asp.net:如何验证文件上传的文件类型?

关于asp.net:如何验证文件上传的文件类型?

How do I Validate the File Type of a File Upload?

我正在使用在ASP.NET应用程序中上载文件。 我想限制上传的文件类型(例如:限制为.xls或.xlsx文件扩展名)。

JavaScript或服务器端验证都是可以的(只要服务器端验证将在文件上传之前进行-可能会上传一些非常大的文件,因此任何验证都需要在实际文件上传之前进行) 。


似乎您选择的选项有限,因为您希望在上传之前进行检查。我认为最好的方法是使用javascript验证文件的扩展名。您可以构建有效扩展名的哈希,然后查看哈希中是否存在要上传的文件的扩展名。

HTML:

1
2
<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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
      }
}


使用正则表达式验证器非常简单。

1
2
3
4
5
6
7
<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>

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


我同意Chris的看法,无论您怎么看,检查扩展名都不是对文件类型的验证。 Telerik的radUpload可能是您最好的选择,它提供了要上传文件的ContentType属性,您可以将其与已知的mime类型进行比较。您应该检查:

application / vnd.ms-excel,

应用程序/ excel

应用程序/ x-msexcel

对于新的2k7格式:

application / vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik以前将radUpload作为一个单独的组件出售,但是现在将其包装到控件套件中,这使其价格更高一些,但到目前为止,这是检查真实类型的最简单方法


从javascript,您应该能够在onsubmit处理程序中获取文件名。因此,在您的情况下,您应该执行以下操作:

1
<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>

您可以在上传控件上使用正则表达式验证器:

1
   </asp:RegularExpressionValidator>

输入标签还具有accept属性:

1
<input type="file" accept="application/msexcel" id="fileUpload" runat="server">

但是当我尝试此操作时(使用FF3和IE7)并没有太大的成功


根据kd7的建议您检查文件内容类型的答复,这是一个包装方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private bool FileIsValid(FileUpload fileUpload)
{
    if (!fileUpload.HasFile)
    {
        return false;
    }
    if (fileUpload.PostedFile.ContentType =="application/vnd.ms-excel" ||
        fileUpload.PostedFile.ContentType =="application/excel" ||
        fileUpload.PostedFile.ContentType =="application/x-msexcel" ||
        fileUpload.PostedFile.ContentType =="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" //this is xlsx format
        )
        return true;

    return false;
}

如果要上传的文件是.xls或.xlsx,则返回true


正如某些人所提到的,JavaScript是必经之路。请记住,此处的"验证"仅是文件扩展名,它不会验证文件是否是真正的Excel电子表格!


确保始终在服务器端检查文件扩展名,以确保没有人可以上载.aspx,.asp等恶意文件。


作为一种替代选择,您是否可以使用HTML File Input的" accept"属性来定义可接受的MIME类型。

这里的定义


避免使用标准的Asp.Net控件,而使用Brettle Development的NeadUpload组件:http://www.brettle.com/neatupload

更快,更易于使用,无需担心配置文件中的maxRequestLength参数,并且非常易于集成。


我认为有不同的方法可以做到这一点。由于我不熟悉asp,因此我只能为您提供一些检查特定文件类型的提示:

1)安全的方法:获取有关您希望传递的文件类型的标头的更多信息。解析上传的文件并比较标题

2)快速方法:将文件名分为两部分->文件名和文件结尾。检查文件的结尾并将其与您要允许上传的文件类型进行比较

希望能帮助到你 :)


好吧-您将无法在服务器端执行回发操作,因为文件将在回发期间提交(上传)。

我认为您可以使用JavaScript在客户端上执行此操作。我个人使用的是Telerik的名为radUpload的第三方组件。它具有良好的客户端和服务器端API,并且为大文件上传提供了进度条。

我确定也有开源解决方案。


客户端验证检查:-

HTML:

1
<br />

Javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<script type ="text/javascript">

    var validFilesTypes=["bmp","gif","png","jpg","jpeg","doc","xls"];

    function ValidateFile()

    {

      var file = document.getElementById("<%=FileUpload1.ClientID%>");

      var label = document.getElementById("<%=Label1.ClientID%>");

      var path = file.value;

      var ext=path.substring(path.lastIndexOf(".")+1,path.length).toLowerCase();

      var isValidFile = false;

      for (var i=0; i<validFilesTypes.length; i++)    
      {    
        if (ext==validFilesTypes[i])    
        {    
            isValidFile=true;    
            break;    
        }    
      }

      if (!isValidFile)    
      {    
        label.style.color="red";    
        label.innerHTML="Invalid File. Please upload a File with" +    
        " extension:\
\
"
+validFilesTypes.join(",");    
      }    
      return isValidFile;    
     }

就像另一位受访者指出的那样,该文件类型可能是伪造的(例如,.exe重命名为.pdf),这不会阻止MIME类型的检查(即,如果将.exe重命名为,则该文件将显示MIME为" application / pdf")。 pdf)。我相信只能在服务器端完成对真实文件类型的检查。这里介绍了一种使用System.IO.BinaryReader进行检查的简单方法:

http://forums.asp.net/post/2680667.aspx

和VB版本在这里:

http://forums.asp.net/post/2681036.aspx

请注意,您需要知道要检查的文件类型的二进制"代码",但是可以通过实施此解决方案并调试代码来获取它们。


您唯一的选择似乎是客户端验证,因为服务器端意味着文件已经上传。同样,MIME类型通常由文件扩展名决定。

使用jQuery之类的JavaScript框架来重载表单的onsubmit事件。然后检查扩展名。这将限制大多数尝试。但是,如果有人将图像更改为扩展名XLS,那么您将遇到问题。

我不知道这是否适合您,但是在使用Silverlight或Flash之类的内容进行上传时,您拥有更多的客户端控制权。您可以考虑在上传过程中使用其中一种技术。


推荐阅读