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

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

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

Ответ 1

Похоже, у вас будут ограниченные возможности, так как вы хотите, чтобы проверка происходила перед загрузкой. Я думаю, что лучше всего вы собираетесь использовать 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;
      }
}

Ответ 3

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

Ответ 4

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

application/vnd.ms-excel,

application/excel,

application/x-msexcel

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

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

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

Ответ 5

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

  <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 type="file" accept="application/msexcel" id="fileUpload" runat="server">

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

Ответ 6

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

Ответ 7

Основываясь на ответе 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

Ответ 8

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

Ответ 9

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

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

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

Ответ 10

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

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

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

Как отмечает один из респондентов, тип файла может быть подделан (например,.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

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

Ответ 15

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

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>