Как проверить тип файла для загрузки файла? - PullRequest
35 голосов
/ 16 сентября 2008

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

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

Ответы [ 15 ]

30 голосов
/ 16 сентября 2008

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

С помощью валидатора выражений regulare все довольно просто.

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

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

6 голосов
/ 16 сентября 2008

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

application / vnd.ms-excel,

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

заявка / x-msexcel

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

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

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

6 голосов
/ 16 сентября 2008

Из 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 голосов
/ 16 сентября 2008

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

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

3 голосов
/ 04 июля 2013

На основании ответа 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 голосов
/ 16 сентября 2008

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

2 голосов
/ 01 декабря 2008

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

1 голос
/ 18 февраля 2010

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

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

1 голос
/ 16 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...