it-swarm-eu.dev

Jak mohu ověřit typ souboru Upload souboru?

Používám <input type="file" id="fileUpload" runat="server"> k nahrání souboru v aplikaci ASP.NET. Chtěl bych omezit typ souboru uploadu (příklad: limit na přípony .xls nebo .xlsx). 

Jak JavaScript, tak ověřování na straně serveru jsou v pořádku (pokud bude ověření na straně serveru probíhat dříve, než budou soubory nahrány - mohlo by dojít k nahrání velmi velkých souborů, takže je třeba provést ověření před nahráním skutečných souborů) .

35
Yaakov Ellis

Vypadá to, že budete mít omezené možnosti, protože chcete, aby kontrola proběhla před nahráním. Myslím, že nejlepší, co se chystáte dostat, je použít javascript k ověření rozšíření souboru. Můžete vytvořit hash platných rozšíření a pak se podívat, zda rozšíření nahraného souboru existovalo v 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;
      }
}
29
Jamie

Je to docela jednoduché pomocí regulátoru regulárního výrazu. 

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

Ověření typu souborů na straně klienta přípustné pro nahrání

26
shailesh

Z javascriptu byste měli mít možnost získat jméno v obslužném programu onsubmit. Takže ve vašem případě byste měli udělat něco jako:

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

Souhlasím s Chrisem, kontrola rozšíření není ověření typu souboru, jak se na něj díváte. Telerikova radUpload je pravděpodobně vaše nejlepší volba, poskytuje vlastnost ContentType nahraného souboru, kterou můžete porovnat se známými typy mime. Měli byste zkontrolovat:

aplikace/vnd.ms-Excel, 

aplikace/Excel, 

aplikace/x-msexcel 

a pro nový formát 2k7:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik prodával radUpload jako samostatnou komponentu, ale nyní je zabalen do sady ovládacích prvků, což z něj dělá o něco dražší, ale zdaleka nejjednodušší způsob, jak zjistit pravý typ

6
kd7

Na ovládacím prvku pro upload můžete použít validátor regulárního výrazu:

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

K dispozici je také atribut accept vstupní značky:

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

ale já jsem neměl moc úspěch, když jsem to zkusil (s FF3 a IE7)

4
AlexWilson

Jak někteří lidé zmínili, Javascript je cesta. Mějte na paměti, že "validace" zde je pouze podle přípony souboru, nebude validovat, že soubor je skutečnou tabulkou aplikace Excel!

3
Jonathan Arkell

Na základě odpovědi uživatele kd7, která doporučuje zkontrolovat typ obsahu souborů, je zde metoda 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;
}

vrací true, pokud je soubor, který chcete nahrát, .xls nebo .xlsx

3
m_cheung

Ujistěte se, že jste vždy zkontrolovali příponu souboru na straně serveru, abyste zajistili, že nikdo nemůže nahrát soubor škodlivý soubor, například soubory .aspx, .asp atd.

2
dr. evil

No - nebudete schopni to udělat na straně serveru na post-back, protože soubor bude odeslán (nahráno) během zpětného odeslání.

Myslím, že to můžete udělat na klientovi pomocí JavaScriptu. Osobně používám komponentu třetí strany nazvanou radUpload od Telerika . Má dobré API na straně klienta a na straně serveru a poskytuje indikátor průběhu velkých souborů.

Jsem si jistý, že jsou k dispozici i open source řešení.

1
Chris Roberts

Jako alternativní možnost byste mohli použít atribut "akceptovat" HTML Input, který definuje, které typy MIME jsou přijatelné.

Definice zde

1
chillysapien

Vyvarujte se standardního řízení Asp.Net a používejte komponentu NeadUpload od společnosti Brettle Development: http://www.brettle.com/neatupload

Rychlejší, jednodušší použití, bez obav o parametr maxRequestLength v konfiguračních souborech a velmi snadno integrovatelný.

1
massimogentilini

Myslím, že existují různé způsoby, jak toho dosáhnout. Vzhledem k tomu, že im není známo, že asp i mohu jen vám několik tipů pro kontrolu konkrétního typu souboru:

1) bezpečný způsob: získat více informací o záhlaví souboru, který chcete předat. analyzovat nahraný soubor a porovnat záhlaví 

2) rychlý způsob: rozdělte název souboru na dva kusy -> název souboru a konec souboru. podívejte se na konec souboru a porovnejte jej s typem souboru, který chcete povolit

doufám, že to pomůže :)

1
DeeCee

Zdá se, že jedinou možností je ověření na straně klienta, protože strana serveru znamená, že soubor byl již nahrán. Typ MIME je obvykle diktován příponou souboru. 

použít JavaScript Framework jako jQuery k přetížení onsubmit události formuláře. Pak zkontrolujte rozšíření. To omezí většinu pokusů. Pokud však osoba změní obrázek na příponu XLS, budete mít problém.

Nevím, zda se jedná o možnost pro vás, ale máte více kontroly na straně klienta, když používáte něco jako Silverlight nebo Flash k nahrání. Můžete použít jednu z těchto technologií pro svůj proces nahrávání.

0
Nick Berardi

Jako další respondent poznamenává, že typ souboru může být falešný (např. .Exe přejmenovaný .pdf), který kontrolu typu MIME nezabrání (tj. Exe bude zobrazovat MIME "application/pdf", pokud bude přejmenován jako. pdf). Věřím, že kontrola pravého typu souboru může být provedena pouze na straně serveru; jednoduchý způsob, jak ji zkontrolovat pomocí System.IO.BinaryReader je popsán zde:

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

a verze VB zde: 

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

Všimněte si, že budete potřebovat znát binární 'kódy' pro typ souboru, který kontrolujete, ale můžete je získat implementací tohoto řešení a laděním kódu.

0
Mark_fsg

Kontrola ověření na straně klienta: -

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