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

时间:2008-09-16 13:01:15

标签: asp.net javascript validation file upload

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

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

15 个答案:

答案 0 :(得分:30)

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

答案 1 :(得分:26)

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

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

Client-Side Validation of File Types Permissible to Upload

答案 2 :(得分:6)

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

答案 3 :(得分:6)

我同意Chris的意见,检查扩展程序是不是以任何方式验证文件类型。 Telerik's radUpload可能是您的最佳选择,它提供了正在上传的文件的ContentType属性,您可以将其与已知的mime类型进行比较。你应该检查:

application / vnd.ms-excel,

application / excel,

application / x-msexcel

和新的2k7格式:

应用/ vnd.openxmlformatsofficedocument.spreadsheetml.sheet

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

答案 4 :(得分: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时,我没有取得多大成功

答案 5 :(得分:3)

正如有些人提到的,Javascript是要走的路。请记住,此处的“验证”仅通过文件扩展名,它不会验证该文件是否是真正的Excel电子表格!

答案 6 :(得分:3)

根据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

答案 7 :(得分:2)

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

答案 8 :(得分:1)

嗯 - 由于文件将在回发期间提交(上传),因此您无法在回发后进行服务器端。

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

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

答案 9 :(得分:1)

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

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

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

希望它有所帮助:)

答案 10 :(得分:1)

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

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

答案 11 :(得分:1)

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

定义here

答案 12 :(得分:0)

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

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

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

答案 13 :(得分:0)

正如另一位受访者所说,文件类型可能是欺骗性的(例如,.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

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

答案 14 :(得分:0)

客户端验证检查:-

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>