Pergunta

estou usando <input type="file" id="fileUpload" runat="server"> para fazer upload de 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).

A validação do JavaScript ou do lado do servidor está OK (desde que a validação do lado do servidor ocorra antes do upload dos arquivos - pode haver upload de alguns arquivos muito grandes, portanto, qualquer validação precisa ocorrer antes que os arquivos reais sejam carregados) .

Foi útil?

Solução

Parece que você terá opções limitadas, pois deseja que a verificação ocorra antes do upload.Acho que o melhor que você vai conseguir é usar javascript para validar a extensão do arquivo.Você poderia criar um hash de extensões válidas e então 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;
      }
}

Outras dicas

É muito simples usar o validador de expressão regular.

<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 arquivos permitidos para upload

Em javascript, você poderá obter o nome do arquivo no manipulador onsubmit.Então, no seu caso, você deve 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>

Concordo com Chris, verificar a extensão não é uma validação do tipo de arquivo de qualquer maneira que você olhe. RadUpload de Telerik é provavelmente sua melhor opção, pois fornece uma propriedade ContentType do arquivo que está sendo carregado, que você pode comparar com tipos MIME conhecidos.Você deve verificar:

aplicativo/vnd.ms-excel,

aplicativo/excel,

aplicativo/x-msexcel

e para o novo formato 2k7:

aplicação/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

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

Você poderia usar um validador de expressão regular 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 não tive muito sucesso quando tentei isso (com FF3 e IE7)

Como algumas pessoas mencionaram, Javascript é o caminho a percorrer.Lembre-se que a “validação” aqui é apenas pela extensão do arquivo, não validará se o arquivo é uma planilha Excel real!

Com base na resposta do kd7 sugerindo que você verifique o tipo de conteúdo dos arquivos, aqui está um método 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 verdadeiro se o arquivo a ser carregado for .xls ou .xlsx

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. arquivo malicioso como .aspx, .asp etc.

Bem - você não poderá fazer isso no lado do servidor no post-back, pois o arquivo será enviado (carregado) durante o post-back.

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

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

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

1) a forma segura:obtenha mais informações sobre o cabeçalho do tipo de arquivo que você deseja passar.analise o arquivo enviado e compare os cabeçalhos

2) a maneira rápida:divida o nome do arquivo em duas partes -> nome do arquivo e o final do arquivo.verifique o final do arquivo e compare-o com o tipo de arquivo que você deseja permitir o upload

espero que ajude :)

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

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

Como opção alternativa, você poderia usar o atributo "aceitar" da entrada de arquivo HTML, que define quais tipos MIME são aceitáveis.

Definição aqui

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 jQuery para sobrecarregar o evento onsubmit do formulário.Em seguida, verifique a extensão.Isso limitará a maioria das tentativas.Porém, se uma pessoa alterar uma imagem para a extensão XLS, você terá um problema.

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

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

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

e versão VB aqui:

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

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

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top