2008-09-16 17 views
34

Sto utilizzando <input type="file" id="fileUpload" runat="server"> per caricare un file in un'applicazione ASP.NET. Vorrei limitare il tipo di file del caricamento (esempio: limite alle estensioni di file .xls o .xlsx).Come convalidare il tipo di file di un caricamento file?

Sia la convalida JavaScript che quella lato server sono OK (fino a quando la convalida del lato server avverrà prima che i file vengano caricati - potrebbero essere caricati file molto grandi, quindi qualsiasi convalida deve aver luogo prima dell'effettiva i file sono caricati).

risposta

29

Sembra che si sta per avere opzioni limitate in quanto si desidera che il controllo avvenga prima il caricamento. Penso che il meglio che otterrai sia l'uso di javascript per convalidare l'estensione del file. Potresti creare un hash di estensioni valide e quindi cercare se l'estensione del file da caricare esistesse nell'hash.

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

non dimenticare, questa è solo la validazione lato client. Posso ancora "manualmente" HTTP-POST all'URL del modulo per ignorare questo controllo - dovrai anche eseguire un controllo di convalida sul lato server. –

+0

@jamie come controllare i documenti di parole '.doc' e' .docx' ... –

+0

Basta aggiungere l'estensione alla variabile "hash". var hash = {'xls': 1, 'xlsx': 1, 'doc': 1, 'docx': 1}; – Jamie

1

Bene - non sarà possibile farlo lato server sul post-back in quanto il file verrà inviato (caricato) durante il post-back.

Penso che potresti essere in grado di farlo sul client utilizzando JavaScript. Personalmente, utilizzo un componente di terze parti chiamato radUpload by Telerik. Ha una buona API lato client e lato server e fornisce una barra di avanzamento per i caricamenti di file di grandi dimensioni.

Sono sicuro che ci sono anche soluzioni open source disponibili.

0

L'unica opzione sembra essere la convalida lato client, perché lato server indica che il file è già stato caricato. Anche il tipo MIME è solitamente dettato dall'estensione del file.

utilizzare un framework JavaScript come jQuery per sovraccaricare l'evento onsubmit del modulo. Quindi controlla l'estensione. Questo limiterà la maggior parte dei tentativi. Tuttavia, se una persona cambia un'immagine nell'estensione XLS, si avrà un problema.

Non so se questa è un'opzione per voi, ma avete più controllo sul lato client quando usate qualcosa come Silverlight o Flash per caricare. Potresti considerare l'utilizzo di una di queste tecnologie per la tua procedura di caricamento.

6

Da javascript, dovresti essere in grado di ottenere il nome file nel gestore onsubmit. Quindi nel tuo caso, si dovrebbe fare qualcosa di simile:

<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

È possibile utilizzare un normale validatore espressione su controllo di caricamento:

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

C'è anche l'attributo accept del tag input:

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

ma non ho avuto molto successo quando ho provato questo (con FF3 e IE7)

1

ci credo sono diversi modi per farlo. Dal momento che non ho familiarità con asp, posso solo darti qualche suggerimento per verificare uno specifico tipo di file:

1) il modo sicuro: ottenere maggiori informazioni sull'intestazione del tipo di file che si desidera passare. analizzare il file caricato e confrontare le intestazioni

2) il modo rapido: dividere il nome del file in due parti -> nome del file e la fine del file. controllare la fine del file e confrontarlo con il tipo di file che si desidera consentire per essere caricato

Speranza che aiuta :)

1

evitare il controllo Asp.Net standard ed utilizzare il componente NeadUpload da Brettle Sviluppo: http://www.brettle.com/neatupload

Più veloce, più facile da usare, non preoccuparsi del parametro maxRequestLength nei file di configurazione e molto facile da integrare.

3

Come alcune persone hanno menzionato, Javascript è la strada da percorrere. Ricorda che la "validazione" qui è solo per estensione del file, non convalida che il file è un vero foglio di calcolo Excel!

6

Sono d'accordo con Chris, il controllo dell'estensione non è la convalida del tipo di file in alcun modo a cui si guarda. Telerik's radUpload è probabilmente la tua migliore opzione, fornisce una proprietà ContentType del file che viene caricato, che puoi confrontare con i tipi di mime conosciuti. Si dovrebbe verificare la presenza di:

application/vnd.ms-excel,

application/excel,

application/x-msexcel

e per il nuovo formato 2K7:

applicazione /vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik vendeva radUpload come un singolo componente, ma ora è avvolto in e controlla suite, che lo rende un po 'più costoso, ma è di gran lunga il modo più semplice per verificare il vero tipo

+0

secondo il sito web, questo servizio costa ... – Thundter

1

Assicurarsi di controllare sempre l'estensione del file sul lato server per assicurarsi che nessuno possa caricare un file dannoso come .aspx, .asp ecc.

1

Come opzione alternativa, è possibile utilizzare l'attributo "accetta" di HTML File Input che definisce quali tipi MIME sono accettabili.

Definizione here

26

E 'piuttosto semplice utilizzando regulare validatore espressione.

<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

+1

Regex fa distinzione tra maiuscole e minuscole per impostazione predefinita. Puoi disabilitarlo usando (? I) per un gruppo (come indicato qui -> http://www.exampledepot.com/egs/java.util.regex/Case.html). Tuttavia, non funzionerà per Javascript (come indicato qui http://stackoverflow.com/questions/2641236/make-regular-expression-case-insensitive e testato personalmente da me). – marquito

3

Sulla base KD7 di Reply suggerendo di controllare per il tipo di contenuto dei file, ecco un metodo involucro:

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

restituendo vero se il file da caricare è .xls o .xlsx

0

Come un altro interlocutore rileva, il tipo di file può essere falsificato (ad esempio, exe rinominato .pdf), che non verifica il tipo MIME (ad esempio, l'exe w mostra un MIME di "application/pdf" se rinominato come .pdf). Credo che un controllo del tipo di file vero possa essere fatto solo lato server; un modo semplice per controllarlo usando System.IO.BinaryReader è descritto qui:

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

e la versione VB qui:

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

Si noti che è necessario conoscere i 'codici' binari per il tipo di file (s) che si' controllare, ma è possibile ottenerli implementando questa soluzione e eseguendo il debug del codice.