Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

приложение/vnd.ms-excel,

приложение/эксель,

приложение/x-msexcel

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

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

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

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

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

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

На основании ответа 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top