it-swarm-ru.tech

Как проверить тип файла для загрузки файла?

Я использую <input type="file" id="fileUpload" runat="server"> для загрузки файла в приложении ASP.NET. Я хотел бы ограничить тип файла для загрузки (например: ограничение до .xls или .xlsx расширений файлов). 

И JavaScript, или проверка на стороне сервера в порядке (если проверка на стороне сервера будет иметь место до загрузки файлов - могут быть загружены некоторые очень большие файлы, поэтому любая проверка должна быть выполнена до того, как будут загружены фактические файлы) ,.

35
Yaakov Ellis

Похоже, у вас будут ограниченные возможности, так как вы хотите, чтобы проверка происходила перед загрузкой. Я думаю, что лучшее, что вы собираетесь получить, это использовать javascript для проверки расширения файла. Вы можете создать хеш допустимых расширений, а затем посмотреть, существует ли расширение загружаемого файла в хеше.

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

Это довольно просто, используя валидатор регулярных выражений. 

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

Клиентская проверка типов файлов, разрешенных для загрузки

26
shailesh

Из javascript вы сможете получить имя файла в обработчике onsubmit. Так что в вашем случае вы должны сделать что-то вроде:

<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

Я согласен с Крисом, проверка расширения не является проверкой типа файла, как бы вы на него ни смотрели. Telerik's radUpload , вероятно, ваш лучший вариант, он предоставляет свойство ContentType загружаемого файла, которое вы можете сравнить с известными типами MIME. Вы должны проверить:

применение/vnd.ms-Excel, 

приложение/Excel, 

применение/х-MSExcel 

и для нового формата 2k7:

приложение/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik раньше продавал RadUpload в качестве отдельного компонента, но теперь он включен в набор средств управления, что делает его немного дороже, но на сегодняшний день это самый простой способ проверить подлинность типа.

6
kd7

Вы можете использовать валидатор регулярных выражений в элементе управления загрузкой:

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

Существует также атрибут accept тега input:

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

но у меня не было большого успеха, когда я попробовал это (с FF3 и IE7)

4
AlexWilson

Как уже упоминали некоторые люди, Javascript - это путь. Имейте в виду, что «проверка» здесь только по расширению файла, она не будет проверять, является ли файл настоящей таблицей Excel!

3
Jonathan Arkell

На основании ответа kd7, предлагающего проверить тип содержимого файлов, вот метод обертки:

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

возвращает true, если файл для загрузки - .xls или .xlsx

3
m_cheung

Убедитесь, что вы всегда проверяете расширение файла на стороне сервера, чтобы никто не мог загрузить вредоносный файл такой как .aspx, .asp и т.д.

2
dr. evil

Что ж, вы не сможете сделать это на стороне сервера при обратной передаче, поскольку файл будет отправлен (загружен) во время обратной передачи.

Я думаю, что вы можете сделать это на клиенте с помощью JavaScript. Лично я использую сторонний компонент под названием radUpload от Telerik . Он имеет хороший клиентский и серверный API и предоставляет индикатор для загрузки больших файлов.

Я уверен, что есть и решения с открытым исходным кодом.

1
Chris Roberts

В качестве альтернативы вы можете использовать атрибут accept для ввода файлов HTML, который определяет, какие типы MIME являются приемлемыми.

Определение здесь

1
chillysapien

Избегайте стандартного управления Asp.Net и используйте компонент NeadUpload от Brettle Development: http://www.brettle.com/neatupload

Быстрее, проще в использовании, не нужно беспокоиться о параметре maxRequestLength в конфигурационных файлах и очень легко интегрировать.

1
massimogentilini

Я думаю, что есть разные способы сделать это. Так как я не знаком с asp, я могу дать вам только несколько советов для проверки определенного типа файла:

1) безопасный способ: получите больше информации о заголовке типа файла, который вы хотите передать. разобрать загруженный файл и сравнить заголовки 

2) быстрый способ: разделить имя файла на две части -> имя файла и окончание файла. проверьте окончание файла и сравните его с типом файла, который вы хотите разрешить загружать

надеюсь, поможет :)

1
DeeCee

Похоже, единственным вариантом является проверка на стороне клиента, поскольку на стороне сервера файл уже загружен. Также тип MIME обычно определяется расширением файла. 

используйте JavaScript Framework, такой как jQuery, для перегрузки события onsubmit формы. Затем проверьте расширение. Это ограничит большинство попыток. Однако, если человек изменяет изображение на расширение XLS, у вас будут проблемы.

Я не знаю, подходит ли вам этот вариант, но у вас больше контроля со стороны клиента при использовании для загрузки чего-либо вроде Silverlight или Flash. Вы можете рассмотреть возможность использования одной из этих технологий в процессе загрузки.

0
Nick Berardi

Как отмечает другой респондент, тип файла может быть подделан (например, .exe переименован в .pdf), что не помешает проверка для типа MIME (то есть .exe покажет MIME «application/pdf», если переименован в. PDF). Я считаю, что проверка истинного типа файла может быть выполнена только на стороне сервера; простой способ проверить это с помощью System.IO.BinaryReader описан здесь:

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

и VB версия здесь: 

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

Обратите внимание, что вам нужно знать двоичные «коды» для типов файлов, которые вы проверяете, но вы можете получить их, внедрив это решение и отладив код.

0
Mark_fsg

Проверка на стороне клиента: -

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