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

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

提问人:Yaakov Ellis 提问时间:9/16/2008 最后编辑:Peter MortensenYaakov Ellis 更新时间:1/10/2019 访问量:149203

问:

我用于在 ASP.NET 应用程序中上传文件。我想限制上传的文件类型(例如:限制为 .xls 或 .xlsx 文件扩展名)。<input type="file" id="fileUpload" runat="server">

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

asp.net JavaScript 验证 文件 上传

评论


答:

1赞 Chris Roberts 9/16/2008 #1

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

我认为您可以使用 JavaScript 在客户端上做到这一点。就我个人而言,我使用 Telerik 的名为 radUpload 的第三方组件。它有一个很好的客户端和服务器端 API,它为大文件上传提供了一个进度条。

我相信也有可用的开源解决方案。

0赞 Nick Berardi 9/16/2008 #2

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

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

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

6赞 staktrace 9/16/2008 #3

从 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>
4赞 AlexWilson 9/16/2008 #4

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

  <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)时,我并没有取得太大的成功

1赞 DeeCee 9/16/2008 #5

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

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

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

希望它能帮助:)

31赞 Jamie 9/16/2008 #6

似乎您的选择有限,因为您希望在上传之前进行检查。我认为你得到的最好的结果是使用 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;
      }
}

评论

13赞 Pure.Krome 5/7/2009
别忘了,这只是客户端验证。我仍然可以“手动”HTTP-POST 到表单 url 以绕过此检查 - 您还需要进行服务器端验证检查。
0赞 Jamie 4/16/2010
只需将这些扩展名添加到变量“hash”中即可。var hash = { 'xls' : 1, 'xlsx' : 1, 'doc' : 1, 'docx' : 1 };
2赞 Justin Moore 3/17/2011
当文件名包含额外的 .' 时,这将返回 falses 例如 my.file.doc
5赞 Justin Moore 3/17/2011
我使用了上面,但使用 :'var ext = value.slice(value.lastIndexOf(“.”)) 获取了文件的扩展名。toLowerCase();'
1赞 Alexander.Berg 9/24/2012
@Justin Moore:好的解决方案,一个变化:var ext = value.slice(value.lastIndexOf(“.”) )。toLowerCase();+ 1
1赞 massimogentilini 9/16/2008 #7

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

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

3赞 Jonathan Arkell 9/16/2008 #8

正如一些人所提到的,Javascript 是要走的路。请记住,这里的“验证”只是通过文件扩展名,它不会验证文件是否是真正的 excel 电子表格!

6赞 Ta01 9/16/2008 #9

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

application/vnd.ms-excel、

application/excel,

应用程序/x-msexcel

对于新的 2K7 格式:

应用程序/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik 曾经将 radUpload 作为单独的组件出售,但现在它被包装在控件套件中,这使得它有点贵,但到目前为止,它是检查真实类型的最简单方法

2赞 dr. evil 12/1/2008 #10

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

1赞 chillysapien 2/18/2010 #11

作为替代选项,您可以使用 HTML 文件输入的“accept”属性来定义哪些 MIME 类型是可接受的。

此处定义

27赞 shailesh 7/7/2010 #12

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

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

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

评论

1赞 marquito 10/1/2012
默认情况下,Regex 区分大小写。您可以使用 (?i) 对组禁用它(如此处所述 -> exampledepot.com/egs/java.util.regex/Case.html)。不过,它不适用于 Javascript(如 stackoverflow.com/questions/2641236/ 所述,并由我亲自测试)。
3赞 m_cheung 7/4/2013 #13

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

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

0赞 Mark_fsg 10/24/2013 #14

正如另一位受访者所指出的,文件类型可能是欺骗性的(例如,.exe重命名为.pdf),检查MIME类型不会阻止(即,如果重命名为.pdf,.exe将显示“application/pdf”的MIME)。我相信对真实文件类型的检查只能在服务器端完成;下面介绍了使用 System.IO.BinaryReader 检查它的简单方法:

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

和 VB 版本在这里:

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

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

0赞 Rana 1/10/2019 #15

客户端验证检查:-

HTML格式:

<asp:FileUpload ID="FileUpload1" runat="server" />
<asp:Button ID="btnUpload" runat="server" Text="Upload" OnClientClick = "return ValidateFile()"  OnClick="btnUpload_Click"  />
<br />
<asp:Label ID="Label1" runat="server" Text="" />

Javascript的:

<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:\n\n"+validFilesTypes.join(", ");    
      }    
      return isValidFile;    
     }    
</script>