如何validationfile upload的文件types?

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

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

似乎你会有有限的select,因为你想在上传之前进行检查。 我认为你将得到的最好的是使用JavaScript来validation文件的扩展名。 您可以构build有效扩展的散列,然后查看散列中存在的文件的扩展名是否存在。

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; } } 

使用正则expression式validation器非常简单。

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

允许上传的文件types的客户端validation

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

我同意克里斯,检查扩展是不validation文件的types,你看它的任何方式。 Telerik的radUpload可能是你最好的select,它提供了上传文件的ContentType属性,你可以将它与已知的MIMEtypes进行比较。 你应该检查:

应用/ vnd.ms-Excel中,

应用程序/ Excel中,

应用程序/ x-msexcel的

和新的2k7格式:

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

Telerik用来销售RadUpload作为一个单独的组件,但现在它被包装到控制套件中,这使得它更加昂贵一些,但是到目前为止,它是检查真实types的最简单方法

您可以在上传控件上使用正则expression式validation器:

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

还有input标签的接受属性:

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

但我没有太多的成功,当我尝试这个(与FF3和IE7)

正如一些人所说,Javascript是要走的路。 请记住,这里的“validation”只是通过文件扩展名,它不会validation该文件是一个真正的Excel电子表格!

根据kd7的回复build议你检查文件的内容types,这里是一个包装方法:

 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的客户端上做到这一点。 就个人而言,我使用Telerik的称为radUpload的第三方组件。 它具有良好的客户端和服务器端API,并为大file upload提供了进度条。

我确定也有开源解决scheme。

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

1)安全的方式:获取更多关于你想传递的文件types的信息。 parsing上传的文件并比较标题

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

希望它有助于:)

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

更快,更易于使用,不用担心configuration文件中的maxRequestLength参数,并且非常易于集成。

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

作为替代选项,您可以使用HTML文件input的“接受”属性来定义哪些MIMEtypes可以接受。

定义在这里

你可以试试这个

 <script> $(document).ready(function () { $('input[type=file]').change(function () { var val = $(this).val().toLowerCase(); var regex = new RegExp("(.*?)\.(docx|doc|pdf|xml|bmp|ppt|xls)$"); if(!(regex.test(val))) { $(this).val(''); alert('Please select correct file format'); } }); }); </script> 

你唯一的select似乎是客户端validation,因为服务器端意味着文件已经上传。 此外,MIMEtypes通常由文件扩展名决定。

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

我不知道这是否是您的select,但在使用Silverlight或Flash等上传内容时,您有更多的客户端控制。 您可以考虑使用这些技术之一来进行上传。

正如另一名受访者指出的那样,文件types可以被伪造(例如,.exe重命名.pdf),检查MIMEtypes不会阻止(即,如果重命名为.exe将显示“application / pdf”的MIME。 PDF)。 我相信只有在服务器端才能检查真正的文件types; 一个简单的方法来检查它使用System.IO.BinaryReader在这里描述:

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

和VB版本在这里:

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

请注意,您需要知道要检查的文件types的二进制“代码”,但是可以通过实现此解决scheme并debugging代码来获取它们。