如何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代码来获取它们。
- move_uploaded_file在所有configuration完成后给出“无法打开stream:权限被拒绝”错误
- AngularJS:使用$ resource上传文件(解决scheme)
- 从浏览器上传多个文件的最佳方法
- PHP – 上传utf-8文件名
- 是否有一个公共FTP服务器来testing上传和下载?
- 如何解决这个java.lang.NoClassDefFoundError:org / apache / commons / io / output / DeferredFileOutputStream?
- 通过回形针保存来自URL的图像
- HTML:如何限制file upload只能是图片?
- 将file upload到iPhone上的FTP服务器