【问题标题】:How do I Validate the File Type of a File Upload?如何验证文件上传的文件类型?
【发布时间】:2010-09-09 11:22:02
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net javascript validation file upload


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案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】:

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

            <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】:

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

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

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

            希望对你有帮助:)

            【讨论】:

              【解决方案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;
                    }
              }
              

              【讨论】:

              • 别忘了,这只是客户端验证。我仍然可以“手动”HTTP-POST 到表单 url 以绕过此检查 - 您还需要进行服务器端验证检查。
              • 只需将这些扩展添加到变量“hash”。 var hash = { 'xls' : 1, 'xlsx' : 1, 'doc' : 1, 'docx' : 1 };
              • 当文件名包含额外的 . 时返回 false,例如 my.file.doc
              • 我在上面使用过,但是使用 :'var ext = value.slice(value.lastIndexOf(".")).toLowerCase();'得到了文件的扩展名
              • @Justin Moore:很好的解决方案,一个变化: var ext = value.slice(value.lastIndexOf(".") + 1).toLowerCase();
              【解决方案7】:

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

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

                  应用程序/vnd.ms-excel,

                  应用程序/excel,

                  应用程序/x-msexcel

                  对于新的 2k7 格式:

                  application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

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

                  【讨论】:

                    【解决方案10】:

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

                    【讨论】:

                      【解决方案11】:

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

                      定义here

                      【讨论】:

                        【解决方案12】:

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

                        <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

                        【讨论】:

                        【解决方案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

                        【讨论】:

                          【解决方案14】:

                          正如另一位受访者所说,文件类型可以被欺骗(例如,.exe 重命名为 .pdf),检查 MIME 类型不会阻止(即,.exe 将显示“application/pdf”的 MIME,如果重命名为 .pdf)。我相信对真实文件类型的检查只能在服务器端进行;此处描述了一种使用 System.IO.BinaryReader 进行检查的简单方法:

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

                          和VB版本在这里:

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

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

                          【讨论】:

                            【解决方案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>
                            

                            【讨论】:

                              猜你喜欢
                              • 2013-12-14
                              • 2016-01-18
                              • 1970-01-01
                              • 1970-01-01
                              • 2012-07-29
                              • 1970-01-01
                              • 2012-07-31
                              • 2014-01-23
                              • 1970-01-01
                              相关资源
                              最近更新 更多