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

Eu estou usando 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 dos arquivos reais serem carregados) .

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:

   

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

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

   

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

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

 
...

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,

aplicação / 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

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

    

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

  

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

Como algumas pessoas mencionaram, o Javascript é o caminho a percorrer. Tenha em mente que a “validação” aqui é apenas pela extensão do arquivo, ele não irá validar que 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 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 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 carregar um arquivo malicioso , como .aspx, .asp etc.

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

Eu acho que você pode fazer isso no cliente usando JavaScript. Pessoalmente, eu uso um componente de terceiros chamado radUpload pela 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 também existem soluções de código aberto disponíveis.

Eu acho que existem maneiras diferentes 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) o caminho seguro: obter mais informações sobre o header do tipo de arquivo que você deseja passar. analisar o arquivo enviado e comparar os headers

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

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

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.

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 versão VB aqui:

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

Note que você precisará saber 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.