Domanda

sto usando <input type="file" id="fileUpload" runat="server"> per caricare un file in un'applicazione ASP.NET.Vorrei limitare il tipo di file da caricare (esempio:limite alle estensioni di file .xls o .xlsx).

Sia la convalida JavaScript che quella lato server sono OK (a condizione che la convalida lato server avvenga prima che i file vengano caricati: potrebbero essere caricati alcuni file molto grandi, quindi qualsiasi convalida deve avvenire prima che i file effettivi vengano caricati) .

È stato utile?

Soluzione

Sembra che avrai opzioni limitate poiché desideri che il controllo avvenga prima del caricamento.Penso che il meglio che otterrai sarà usare Javascript per convalidare l'estensione del file.Potresti creare un hash di estensioni valide e quindi verificare se l'estensione del file caricato esisteva 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;
      }
}

Altri suggerimenti

È piuttosto semplice usare il validatore di espressioni regolari.

<asp:RegularExpressionValidator
id="RegularExpressionValidator1"
runat="server"
ErrorMessage="Only zip file is allowed!"
ValidationExpression ="^.+(.zip|.ZIP)$"
ControlToValidate="FileUpload1"
> </asp:RegularExpressionValidator>

Convalida lato client dei tipi di file consentiti per il caricamento

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

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

Sono d'accordo con Chris, controllare l'estensione non è la convalida del tipo di file in qualunque modo lo guardi. radUpload di Telerik è probabilmente la soluzione migliore, fornisce una proprietà ContentType del file caricato, che puoi confrontare con i tipi MIME conosciuti.Dovresti verificare:

applicazione/vnd.ms-excel,

applicazione/Excel,

applicazione/x-msexcel

e per il nuovo formato 2k7:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik vendeva radUpload come componente individuale, 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

Potresti utilizzare un validatore di espressioni regolari sul 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 accetta del tag di input:

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

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

Come alcune persone hanno già detto, Javascript è la strada da percorrere.Tieni presente che la "convalida" qui è solo per estensione del file, non convaliderà che il file sia 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;
}

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

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

Bene, non sarai in grado di farlo lato server nel post-back poiché 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 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 siano disponibili anche soluzioni open source.

Penso che ci siano diversi modi per farlo.Dato che non ho familiarità con ASP, posso solo darti alcuni suggerimenti per verificare un tipo di file specifico:

1) in modo sicuro:ottieni maggiori informazioni sull'intestazione del tipo di file che desideri 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 fine del file.controlla la fine del file e confrontala con il tipo di file a cui desideri consentire il caricamento

spero che sia d'aiuto :)

Evita il controllo standard di Asp.Net e utilizza 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 utilizzare l'attributo "accetta" dell'input del file HTML che definisce quali tipi MIME sono accettabili.

Definizione Qui

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

utilizzare un framework JavaScript come jQuery per sovraccaricare l'evento onsubmit del modulo.Quindi controlla l'estensione.Ciò limiterà la maggior parte dei tentativi.Tuttavia, se una persona modifica un'immagine con l'estensione XLS, avrai un problema.

Non so se questa è un'opzione per te, ma hai un maggiore controllo lato client quando usi qualcosa come Silverlight o Flash per caricare.Potresti prendere in considerazione l'utilizzo di una di queste tecnologie per il processo di caricamento.

Come notato da un altro intervistato, il tipo di file può essere falsificato (ad esempio, .exe rinominato .pdf), cosa che il controllo del tipo MIME non impedirà (ovvero, .exe mostrerà un MIME di "application/pdf" se rinominato come . PDF).Credo che un controllo del vero tipo di file possa essere effettuato solo lato server;un modo semplice per verificarlo utilizzando 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 controllando, ma puoi ottenerli implementando questa soluzione ed eseguendo il debug del codice.

Controllo della convalida lato client: -

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top