it-swarm-pt.tech

Como faço para validar o tipo de arquivo de um upload de arquivo?

Eu estou usando <input type="file" id="fileUpload" runat="server"> para carregar um arquivo em um aplicativo ASP.NET. Gostaria de limitar o tipo de arquivo do upload (exemplo: limite para extensões de arquivo .xls ou .xlsx). 

Tanto o JavaScript quanto a validação do lado do servidor são OK (desde que a validação do lado do servidor ocorra antes dos arquivos serem carregados - pode haver alguns arquivos muito grandes carregados, portanto, qualquer validação precisa ocorrer antes que os arquivos reais sejam carregados) .

35
Yaakov Ellis

Parece que você terá opções limitadas, já que deseja que a verificação ocorra antes do upload. Eu acho que o melhor que você vai conseguir é usar o javascript para validar a extensão do arquivo. Você pode criar um hash de extensões válidas e, em seguida, verificar se a extensão do arquivo que está sendo carregado existia no 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;
      }
}
29
Jamie

É bem simples usar o validador de expressões regulares. 

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

Validação do lado do cliente dos tipos de arquivo permitidos para upload

26
shailesh

Do javascript, você deve conseguir o nome do arquivo no manipulador do onsubmit. Então, no seu caso, você deveria fazer algo como:

<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

Eu concordo com Chris, verificando a extensão não é a validação do tipo de arquivo de qualquer maneira que você olha para ele. O radUpload do Telerik é provavelmente sua melhor opção, ele fornece uma propriedade ContentType do arquivo que está sendo carregado, que você pode comparar com os tipos mime conhecidos. Você deve verificar:

application/vnd.ms-Excel, 

aplicativo/Excel, 

aplicação/x-msexcel 

e para o novo formato 2k7:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

A Telerik costumava vender o radUpload como um componente individual, mas agora ele é incluído na suíte de controles, o que o torna um pouco mais caro, mas de longe é a maneira mais fácil de verificar o verdadeiro tipo

6
kd7

Você poderia usar um validador de expressões regulares no controle de upload:

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

Há também o atributo accept da tag de entrada:

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

mas eu não tive muito sucesso quando tentei isso (com FF3 e IE7)

4
AlexWilson

Como algumas pessoas mencionaram, o Javascript é o caminho a percorrer. Tenha em mente que a "validação" aqui é apenas por extensão de arquivo, não irá validar que o arquivo é uma planilha real do Excel!

3
Jonathan Arkell

Com base na resposta do kd7 sugerindo que você verifique o tipo de conteúdo dos arquivos, aqui está um método de wrapper:

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

retornando true se o arquivo para upload for .xls ou .xlsx

3
m_cheung

Certifique-se de sempre verificar a extensão do arquivo no lado do servidor para garantir que ninguém possa fazer upload de um arquivo malicioso como .aspx, .asp etc.

2
dr. evil

Bem, você não será capaz de fazê-lo no lado do servidor no post-back, pois o arquivo será submetido (carregado) durante o post-back.

Eu acho que você pode fazer isso no cliente usando JavaScript. Pessoalmente, eu uso um componente de terceiros chamado radUpload by Telerik . Ele tem uma boa API do lado do cliente e do lado do servidor e fornece uma barra de progresso para uploads grandes de arquivos.

Tenho certeza de que existem soluções de código aberto disponíveis também.

1
Chris Roberts

Como opção alternativa, você poderia usar o atributo "accept" do arquivo HTML Input, que define quais tipos MIME são aceitáveis.

Definição aqui

1
chillysapien

Evite o controle Asp.Net padrão e use o componente NeadUpload da Brettle Development: http://www.brettle.com/neatupload

Mais rápido, mais fácil de usar, sem se preocupar com o parâmetro maxRequestLength em arquivos de configuração e muito fácil de integrar.

1
massimogentilini

Eu acho que existem maneiras diferentes de fazer isso. Como eu não estou familiarizado com o asp, só posso dar algumas dicas para verificar um tipo de arquivo específico:

1) o caminho seguro: obter mais informações sobre o cabeçalho do tipo de arquivo que você deseja passar. analisar o arquivo enviado e comparar os cabeçalhos 

2) a maneira rápida: dividir o nome do arquivo em duas partes -> nome do arquivo eo final do arquivo. confira o final do arquivo e compare com o tipo de arquivo que você deseja permitir que seja enviado

espero que ajude :)

1
DeeCee

Sua única opção parece ser a validação do lado do cliente, porque o lado do servidor significa que o arquivo já foi carregado. Além disso, o tipo MIME geralmente é determinado pela extensão do arquivo. 

use um JavaScript Framework como o jQuery para sobrecarregar o evento onsubmit do formulário. Em seguida, verifique a extensão. Isso limitará a maioria das tentativas. No entanto, se uma pessoa alterar uma imagem para a extensão XLS, você terá um problema.

Não sei se isso é uma opção para você, mas você tem mais controle do lado do cliente ao usar algo como o Silverlight ou o Flash para fazer o upload. Você pode considerar o uso de uma dessas tecnologias para o seu processo de upload.

0
Nick Berardi

Como outro entrevistado observa, o tipo de arquivo pode ser falsificado (por exemplo, .exe renomeado .pdf), que a verificação do tipo MIME não impedirá (ou seja, o .exe mostrará um MIME de "application/pdf" se renomeado como. pdf). Eu acredito que uma verificação do tipo de arquivo verdadeiro só pode ser feita no lado do servidor; uma maneira fácil de verificá-lo usando o System.IO.BinaryReader é descrita aqui:

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

e VB versão aqui: 

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

Note que você precisará conhecer os 'códigos' binários para os tipos de arquivo que está verificando, mas você pode obtê-los implementando esta solução e depurando o código.

0
Mark_fsg

Verificação de validação do lado do cliente: -

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