2008-09-16 84 views
34

我正在使用<input type="file" id="fileUpload" runat="server">上傳ASP.NET應用程序中的文件。我想限制上傳的文件類型(例如:限制爲.xls或.xlsx文件擴展名)。如何驗證文件上傳的文件類型?

JavaScript或服務器端驗證都可以(只要服務器端驗證在文件上傳之前進行 - 可能會上傳一些非常大的文件,因此任何驗證都需要在實際進行之前進行文件被上傳)。

回答

29

好像你將不得不選擇有限,因爲你想之前發生的檢查上傳。我認爲你將得到的最好的結果就是使用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; 
     } 
} 
+11

別忘了,這只是客戶端驗證。我仍然可以'手動'HTTP-POST到表單url以繞過此檢查 - 您還需要執行服務器端驗證檢查。 – 2009-05-07 05:47:52

+0

@jamie如何檢查`.doc`和`.docx`文檔... – 2010-04-15 10:58:28

+0

只需將這些擴展名添加到變量「hash」即可。 var hash = {'xls':1,'xlsx':1,'doc':1,'docx':1}; – Jamie 2010-04-15 22:14:45

1

嗯 - 你將無法在回發服務器端完成它,因爲該文件將在回發期間提交(上傳)。

我想你可以在使用JavaScript的客戶端上做到這一點。我個人使用第三方組件radUpload by Telerik。它具有良好的客戶端和服務器端API,併爲大文件上傳提供了進度條。

我確定也有開源解決方案。

0

你唯一的選擇似乎是客戶端驗證,因爲服務器端意味着文件已經上傳。此外,MIME類型通常由文件擴展名指定。

使用JavaScript框架如jQuery來重載窗體的onsubmit事件。然後檢查擴展名。這將限制大多數嘗試。但是,如果某人將圖像更改爲擴展名XLS,那麼您將遇到問題。

我不知道這是否是您的選擇,但您在使用Silverlight或Flash等上傳內容時有更多的客戶端控制。您可以考慮將其中一種技術用於上傳過程。

6

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

你可以對上傳控件使用正則表達式驗證:

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

1

我想有是不同的方式來做到這一點。由於我不熟悉ASP我只能給你一些提示,以檢查特定的文件類型:

1)安全的方式:獲取更多關於您希望傳遞的文件類型標題的信息。解析上傳的文件並比較頭文件

2)快捷方式:將文件名稱分成兩部分 - >文件名稱和文件結尾。檢查出的文件的結尾,並把它比作你想允許上傳

文件類型希望它有助於:)

3

正如一些人所說,JavaScript是要走的路。請記住,這裏的「驗證」只是通過文件擴展名,它不會驗證該文件是一個真正的Excel電子表格!

6

我與克里斯同意,檢查擴展名不是文件類型的驗證任何方式你看它。 Telerik's radUpload可能是您最好的選擇,它提供了正在上傳的文件的ContentType屬性,您可以將其與已知的MIME類型進行比較。您應該檢查:

應用程序/ vnd.ms - Excel中,

應用程序/ Excel中,

應用程序/ x-msexcel的

和新2K7格式:

應用/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik的用於出售radUpload作爲一個單獨的部件,但現在其包裹成第Ë控制套件,這使得它更貴一點,但迄今爲止其最簡單的方法來檢查的真實類型

1

確保始終爲您在服務器端的文件擴展名,以確保沒有人可以上載惡意文件如.aspx,.asp等

1

作爲替代選項,您可以使用HTML文件輸入的「接受」屬性來定義哪些MIME類型可接受。

定義here

26

它使用regulare表達式驗證很簡單。

<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

3

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

0

至於另一位受訪者指出,文件類型可以被欺騙(如.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

請注意,你需要知道的文件類型二進制「碼」你」重新檢查,但你可以通過實現這個解決方案並調試代碼來獲得它們。