Come convalido il tipo di file di un caricamento di file?

Sto usando 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).

Sia la convalida JavaScript che quella lato server sono OK (a patto che la convalida del lato server avvenga prima che i file vengano caricati – potrebbero essere caricati file molto grandi, quindi qualsiasi convalida deve aver luogo prima che i file vengano caricati) .

Sembra che tu abbia opzioni limitate dal momento che vuoi che l’assegno avvenga prima del 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:

   

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

È abbastanza semplice usare il validatore di espressioni regulare.

   

Convalida sul lato client dei tipi di file consentiti per il caricamento

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

 
...

Sono d’accordo con Chris, il controllo dell’estensione non è la convalida del tipo di file in qualsiasi modo tu lo guardi. RadUpload di Telerik è 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 per:

application / vnd.ms-excel,

application / excel,

application / x-msexcel

e per il nuovo formato 2k7:

application / vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik vendeva radUpload come un singolo componente, ma ora è racchiuso nella suite di controlli, il che lo rende un po ‘più costoso, ma è di gran lunga il modo più semplice per verificare il vero tipo

Puoi utilizzare un validatore di espressioni regolari sul controllo di caricamento:

    

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

  

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

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!

In base alla risposta di kd7 che suggerisce di verificare il tipo di contenuto dei file, ecco un metodo wrapper:

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

restituisce true se il file da caricare è .xls o .xlsx

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

Bene: non sarà ansible 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 usando JavaScript. Personalmente, utilizzo un componente di terze parti chiamato radUpload di 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.

Penso che ci siano diversi modi per farlo. Dal momento che non ho familiarità con asp, posso solo darti alcuni suggerimenti 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. controlla la fine del file e confrontalo con il tipo di file che vuoi consentire di caricare

spero che sia d’aiuto 🙂

Evita il controllo standard di Asp.Net e usa il componente NeadUpload di Brettle Development: http://www.brettle.com/neatupload

Più veloce, più facile da usare, nessuna preoccupazione per il parametro maxRequestLength nei file di configurazione e molto facile da integrare.

Come opzione alternativa, potresti usare l’attributo “accept” di HTML File Input che definisce quali tipi MIME sono accettabili.

Definizione qui

La tua unica opzione sembra essere la validazione lato client, perché lato server significa 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 te, ma hai più controllo da parte del client quando usi qualcosa come Silverlight o Flash da caricare. Potresti considerare l’utilizzo di una di queste tecnologie per la tua procedura di caricamento.

Come nota un altro rispondente, il tipo di file può essere falsificato (ad esempio, .exe rinominato .pdf), il che verifica il tipo MIME non impedisce (ad esempio, l’exe mostrerà 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

Tieni presente che dovrai conoscere i “codici” binari per i tipi di file che stai cercando, ma puoi ottenerli implementando questa soluzione e eseguendo il debug del codice.