我怎么验证的文件种类型的文件上传?
-
09-06-2019 - |
题
我使用 <input type="file" id="fileUpload" runat="server">
上载一个文件中的一个ASP.NET 应用程序。我想限制的文件种类型的传(例如:限制。xls。阅读文件的扩展).
两JavaScript或服务器验证是确定的(只要该服务器的端验证会之前的文件正在上传的-可能有一些非常大的文件上载,因此任何验证需要在实际的文件上载).
解决方案
好像你会有限的选项,因为你想要的检查发生之前的上载。我认为最好的你要得到的是使用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;
}
}
其他提示
这是很简单的使用regulare表达验证程序。
<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>
从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>
我赞同克里斯,检查扩展是未验证的文件的类型的任何方式看待它。 阶段的radUpload 可能是你最好的选择,它提供了一个ContentType财产的文件正在上传,它可以比较以知mime类型。你应该检查:
应用/越南盾。ms excel,
应用/excel,
application/x-excel
和新2k7格式:
应用/越南盾。openxmlformatsofficedocument.spreadsheetml.片
阶段用于出售radUpload作为一个单独的组成部分,但现在,它包裹入控制的套房,这使得这一点更加昂贵,但到目前为止,其中最简单的方法以检查的真实类型
你可以使用一个定期表达的验证程序上传控制:
<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 type="file" accept="application/msexcel" id="fileUpload" runat="server">
但我没有取得多大成功时,我尝试了这个(与FF3和IE7)
正如有些人已经提到的,Javascript的路要走。铭记,"验证"这里是仅仅通过文件的延伸,它不会验证的文件是一个真正的excel电子表格!
根据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。您
确保你一直检查的文件的扩展服务器的端到确保,没有人可以上载 恶意文件 如。aspx.asp等。
很好-你不能够做到这一服务器的端后-回来,因为该文件将得到提交的(载)在后回来。
我想你可以能够做到这一点的客户使用JavaScript。就个人而言,我使用一个第三方成分被称为 radUpload通过阶段.它有一个良好的客户和服务器的端API,它提供了一个进度条大的文件上传。
我敢肯定有开放源码解决方案,太。
我认为有不同的方式做到这一点。因为我不熟悉asp我只能给你一些提示,以检查特定的文件类型:
1)在安全的方式:获得更多的信息有关的标题的文件类型你想通过。分析上载的文件和比较的标题
2)在快速的方式:分裂的文件名成两片->文件的名称和结束的文件。检查结束的文件和比较filetype你要允许被上传
希望它有助于:)
避免的标准Asp.Net 控制和使用NeadUpload分Brettle发展: http://www.brettle.com/neatupload
更快速,更容易使用,不用担心maxRequestLength参数的配置文件和很易于整合。
作为替代选项,可以使用的"接受"属性为HTML文件输入它定义哪个MIME类型是可以接受的。
定义 在这里,
你唯一的选择似乎是客户端验证,因为服务器侧意味着该文件已经上载。还MIME type通常是取决于文件的扩展。
使用JavaScript框架喜欢jQuery载的onsubmit事件的形式。然后检查扩展。这将限制最多尝试。但是,如果一个人改变的图像以扩展XLS然后你将会有一个问题。
我不知道如果这是一个选择但你有更多的客户的侧控制时使用的东西喜欢Silverlight或闪上传。你可以考虑使用一些技术上的进程。
作为另一个答复者指出,文件种类可以被欺骗(例如.exe重新命名。pdf),其中检查的类型将不会阻止(即,中。exe会显示一个MIME的"application/pdf"如果重新命名为。pdf)。我相信一个检查文件的真实文件的类型只能服务器的端;一个简单的方式来检查它使用的系统。IO.BinaryReader描述了这里:
http://forums.asp.net/post/2680667.aspx
和VB的版本:
http://forums.asp.net/post/2681036.aspx
注意,你只需要知道的二进制'码'的文件的类型(s)你检查的,但是你可以让他们通过实施这一解决方案和调试的代码。
客户端验证检查:-
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>