我正在使用<input type="file" id="fileUpload" runat="server">
上傳ASP.NET應用程序中的文件。我想限制上傳的文件類型(例如:限制爲.xls或.xlsx文件擴展名)。如何驗證文件上傳的文件類型?
JavaScript或服務器端驗證都可以(只要服務器端驗證在文件上傳之前進行 - 可能會上傳一些非常大的文件,因此任何驗證都需要在實際進行之前進行文件被上傳)。
我正在使用<input type="file" id="fileUpload" runat="server">
上傳ASP.NET應用程序中的文件。我想限制上傳的文件類型(例如:限制爲.xls或.xlsx文件擴展名)。如何驗證文件上傳的文件類型?
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;
}
}
嗯 - 你將無法在回發服務器端完成它,因爲該文件將在回發期間提交(上傳)。
我想你可以在使用JavaScript的客戶端上做到這一點。我個人使用第三方組件radUpload by Telerik。它具有良好的客戶端和服務器端API,併爲大文件上傳提供了進度條。
我確定也有開源解決方案。
你唯一的選擇似乎是客戶端驗證,因爲服務器端意味着文件已經上傳。此外,MIME類型通常由文件擴展名指定。
使用JavaScript框架如jQuery來重載窗體的onsubmit事件。然後檢查擴展名。這將限制大多數嘗試。但是,如果某人將圖像更改爲擴展名XLS,那麼您將遇到問題。
我不知道這是否是您的選擇,但您在使用Silverlight或Flash等上傳內容時有更多的客戶端控制。您可以考慮將其中一種技術用於上傳過程。
從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>
你可以對上傳控件使用正則表達式驗證:
<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)
我想有是不同的方式來做到這一點。由於我不熟悉ASP我只能給你一些提示,以檢查特定的文件類型:
1)安全的方式:獲取更多關於您希望傳遞的文件類型標題的信息。解析上傳的文件並比較頭文件
2)快捷方式:將文件名稱分成兩部分 - >文件名稱和文件結尾。檢查出的文件的結尾,並把它比作你想允許上傳
文件類型希望它有助於:)
避免標準Asp.Net控制和使用從Brettle發展NeadUpload組件:http://www.brettle.com/neatupload
更快,使用更方便,無擔心配置文件中的maxRequestLength參數,並且非常易於集成。
正如一些人所說,JavaScript是要走的路。請記住,這裏的「驗證」只是通過文件擴展名,它不會驗證該文件是一個真正的Excel電子表格!
我與克里斯同意,檢查擴展名不是文件類型的驗證任何方式你看它。 Telerik's radUpload可能是您最好的選擇,它提供了正在上傳的文件的ContentType屬性,您可以將其與已知的MIME類型進行比較。您應該檢查:
應用程序/ vnd.ms - Excel中,
應用程序/ Excel中,
應用程序/ x-msexcel的
和新2K7格式:
應用/vnd.openxmlformatsofficedocument.spreadsheetml.sheet
Telerik的用於出售radUpload作爲一個單獨的部件,但現在其包裹成第Ë控制套件,這使得它更貴一點,但迄今爲止其最簡單的方法來檢查的真實類型
確保始終爲您在服務器端的文件擴展名,以確保沒有人可以上載惡意文件如.aspx,.asp等
作爲替代選項,您可以使用HTML文件輸入的「接受」屬性來定義哪些MIME類型可接受。
定義here
它使用regulare表達式驗證很簡單。
<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>
基於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;
}
返回true,如果要上傳的文件的.xls或.xlsx
至於另一位受訪者指出,文件類型可以被欺騙(如.EXE改名.PDF),其檢查的MIME類型不會阻止(即.EXE w ^如果重命名爲.pdf,則顯示「application/pdf」的MIME)。我相信只有在服務器端才能檢查真正的文件類型;一個簡單的方法來檢查它使用System.IO。BinaryReader在這裏描述:
http://forums.asp.net/post/2680667.aspx
和VB版本在這裏:
http://forums.asp.net/post/2681036.aspx
請注意,你需要知道的文件類型二進制「碼」你」重新檢查,但你可以通過實現這個解決方案並調試代碼來獲得它們。
別忘了,這只是客戶端驗證。我仍然可以'手動'HTTP-POST到表單url以繞過此檢查 - 您還需要執行服務器端驗證檢查。 – 2009-05-07 05:47:52
@jamie如何檢查`.doc`和`.docx`文檔... – 2010-04-15 10:58:28
只需將這些擴展名添加到變量「hash」即可。 var hash = {'xls':1,'xlsx':1,'doc':1,'docx':1}; – Jamie 2010-04-15 22:14:45