Jak sprawdzić typ pliku przesłanego pliku?

Używam <input type="file" id="fileUpload" runat="server"> aby wgrać plik w ASP.NET podanie. Chciałbym ograniczyć Typ pliku uploadu (przykład: limit do .xls lub .rozszerzenia plików xlsx).

Zarówno Walidacja po stronie JavaScript, jak i po stronie serwera jest w porządku (o ile Walidacja po stronie serwera odbywa się przed przesłaniem plików - może być kilka bardzo dużych plików, więc każda Walidacja musi mieć miejsce przed przesłaniem plików).

Author: Peter Mortensen, 2008-09-16

15 answers

Wydaje się, że będziesz miał ograniczone opcje, ponieważ chcesz, aby sprawdzenie miało miejsce przed przesłaniem. Myślę, że najlepsze, co dostaniesz, to użycie javascript do walidacji rozszerzenia pliku. Możesz zbudować hash ważnych rozszerzeń, a następnie sprawdzić, czy rozszerzenie przesłanego pliku istniało w 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;
      }
}
 30
Author: Jamie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:34:40

Jest to dość proste, używając walidatora wyrażenia regulare.

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

Walidacja po stronie klienta typów plików dopuszczalna do przesłania

 26
Author: shailesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-22 20:57:32

Z javascript, powinieneś być w stanie pobrać nazwę pliku w programie obsługi onsubmit. Więc w Twoim przypadku powinieneś zrobić coś w stylu:

<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
Author: staktrace,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:09:28

Zgadzam się z Chrisem, sprawdzanie rozszerzenia nie jest weryfikacją typu pliku. Telerik ' s radUpload jest prawdopodobnie najlepszą opcją, dostarcza właściwość ContentType przesyłanego pliku, którą można porównać do znanych typów mime. Należy sprawdzić:

Application / vnd. ms-excel,

Application / excel,

Application / x-msexcel

I dla nowego 2k7 format:

Application / vnd.openxmlformatsofficedocument.spreadsheetml.Arkusz

Telerik sprzedawał kiedyś radUpload jako pojedynczy komponent, ale teraz jest zapakowany w pakiet kontrolny, co czyni go nieco droższym, ale zdecydowanie najprostszym sposobem na sprawdzenie prawdziwego typu

 6
Author: Ta01,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 14:28:24

Możesz użyć walidatora wyrażeń regularnych w kontrolce wysyłania:

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

Istnieje również atrybut accept znacznika wejściowego:

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

Ale nie odniosłem większego sukcesu, gdy próbowałem tego (z FF3 i IE7)

 4
Author: AlexWilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:18:05

Jak już niektórzy wspominali, Javascript jest najlepszym rozwiązaniem. Należy pamiętać, że" Walidacja " jest tutaj tylko przez rozszerzenie pliku, nie potwierdzi, że plik jest prawdziwym arkuszem kalkulacyjnym excel!

 3
Author: Jonathan Arkell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 14:03:30

Na podstawie odpowiedzi kd7 sugerującej sprawdzenie typu zawartości plików, oto metoda wrappera:

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

Zwracanie true, Jeśli plik do przesłania jest .xls lub .xlsx

 3
Author: m_cheung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-04 11:01:57

Upewnij się, że zawsze sprawdzasz rozszerzenie pliku po stronie serwera, aby upewnić się, że nikt nie może przesłać złośliwego pliku, takiego jak .aspx,asp itp.

 2
Author: dr. evil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-01 11:23:47

Cóż-nie będziesz w stanie tego zrobić po stronie serwera, ponieważ plik zostanie przesłany (przesłany) podczas post-back.

Myślę, że możesz to zrobić na kliencie za pomocą JavaScript. Osobiście używam zewnętrznego komponentu o nazwie radUpload by Telerik . Ma dobre API po stronie klienta i serwera i zapewnia pasek postępu dla przesyłania dużych plików.

Jestem pewien, że są też dostępne rozwiązania open source.

 1
Author: Chris Roberts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:06:44

Myślę, że są na to różne sposoby. Ponieważ nie jestem zaznajomiony z asp mogę tylko dać kilka wskazówek, aby sprawdzić dla określonego typu pliku:

1) bezpieczny sposób: Uzyskaj więcej informacji o nagłówku typu pliku, który chcesz przekazać. analizuje przesłany plik i porównuje Nagłówki

2) Szybki sposób: podziel nazwę pliku na dwie części - > nazwa pliku i zakończenie pliku. sprawdź zakończenie pliku i porównaj go z typem pliku, który chcesz allow to be uploaded

Mam nadzieję, że pomoże:)

 1
Author: DeeCee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:18:46

Unikaj standardu Asp.Net sterowanie i korzystanie z komponentu NeadUpload z Brettle Development: http://www.brettle.com/neatupload

Szybszy, łatwiejszy w użyciu, bez martwienia się o parametr maxRequestLength w plikach konfiguracyjnych i bardzo łatwy do integracji.

 1
Author: massimogentilini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:41:11

Jako alternatywna opcja, czy możesz użyć atrybutu "accept" wejścia pliku HTML, który określa, które typy MIME są akceptowalne.

Definicja TUTAJ

 1
Author: chillysapien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-18 09:59:16

Jedyną opcją wydaje się Walidacja po stronie klienta, ponieważ strona serwera oznacza, że plik został już przesłany. Również typ MIME jest zwykle podyktowany przez rozszerzenie pliku.

Użyj frameworka JavaScript, takiego jak jQuery, aby przeciążyć Zdarzenie onsubmit formularza. Następnie sprawdź rozszerzenie. Ograniczy to większość prób. Jeśli jednak osoba zmieni obraz na rozszerzenie XLS, będziesz miał problem.

Nie wiem czy to jest opcja dla ciebie, ale masz więcej klientów sterowanie boczne podczas używania czegoś takiego jak Silverlight lub Flash do przesyłania. Możesz rozważyć użycie jednej z tych technologii do procesu przesyłania.

 0
Author: Nick Berardi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:09:08

Jak zauważa inny respondent, Typ pliku może być sfałszowany (np., .zmiana nazwy exe .pdf), którego sprawdzanie typu MIME nie uniemożliwi (np.exe wyświetli MIME "application / pdf", jeśli zmieni nazwę na .pdf). Wierzę, że sprawdzenie prawdziwego typu pliku można wykonać tylko po stronie serwera; prosty sposób na sprawdzenie go za pomocą System. IO. BinaryReader jest opisany tutaj:

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

I wersja VB tutaj:

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

Zauważ, że musisz znać binarne 'kody' dla typów plików, których szukasz, ale możesz je uzyskać, wdrażając To rozwiązanie i debugując kod.

 0
Author: Mark_fsg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 20:05:30

Sprawdzanie Walidacji Po Stronie 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
Author: Rana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-09 16:58:24