2008-09-16 27 views
34

Estoy usando <input type="file" id="fileUpload" runat="server"> para cargar un archivo en una aplicación ASP.NET. Me gustaría limitar el tipo de archivo de la carga (ejemplo: límite a extensiones de archivo .xls o .xlsx).¿Cómo puedo validar el tipo de archivo de una carga de archivos?

Tanto la validación de JavaScript como del lado del servidor son correctas (siempre que la validación del servidor tenga lugar antes de que se carguen los archivos; podría haber archivos muy grandes cargados, por lo que cualquier validación debe realizarse antes del real archivos cargados).

Respuesta

29

parece que va a tener opciones limitadas ya que desea que el cheque se produzca antes de la carga Creo que lo mejor que obtendrás es usar javascript para validar la extensión del archivo. Puede construir un hash de extensiones válidas y luego ver si la extensión del archivo que se está cargando existe en el 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; 
     } 
} 
+11

no se olvide, esta es solo la validación del lado del cliente. Todavía puedo 'manualmente' HTTP-POST a la url del formulario para eludir esta comprobación; también deberá realizar una verificación de validación del lado del servidor. –

+0

@jamie cómo comprobar si hay documentos con las palabras '.doc' y' .docx' ... –

+0

Simplemente agregue esa extensión a la variable "hash". var hash = {'xls': 1, 'xlsx': 1, 'doc': 1, 'docx': 1}; – Jamie

1

Bueno, no podrá hacerlo en el lado del servidor en la posterior posterior ya que el archivo será enviado (cargado) durante la devolución posterior.

Creo que es posible que pueda hacerlo en el cliente mediante JavaScript. Personalmente, utilizo un componente de terceros llamado radUpload by Telerik. Tiene una buena API del lado del cliente y del lado del servidor, y proporciona una barra de progreso para grandes cargas de archivos.

Estoy seguro de que hay soluciones de código abierto disponibles, también.

0

Su única opción parece ser la validación del lado del cliente, porque el lado del servidor significa que el archivo ya estaba cargado. Además, el tipo MIME suele estar dictado por la extensión del archivo.

utiliza un Framework de JavaScript como jQuery para sobrecargar el evento onsubmit del formulario. Luego revisa la extensión. Esto limitará la mayoría de los intentos. Sin embargo, si una persona cambia una imagen a la extensión XLS, entonces tendrá un problema.

No sé si esta es una opción para usted, pero tiene más control del lado del cliente cuando usa algo como Silverlight o Flash para cargar. Puede considerar usar una de estas tecnologías para su proceso de carga.

6

Desde javascript, debería poder obtener el nombre del archivo en el controlador onsubmit. Así, en su caso, usted debe hacer 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> 
3

Se puede usar un validador de expresión regular en el control de carga:

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

También existe el atributo accept de la etiqueta de entrada:

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

pero yo no tenía mucho éxito cuando probé este (con FF3 e IE7)

1

Creo que hay son diferentes formas de hacer esto. Dado que no estoy familiarizado con asp Sólo puedo dar algunas pistas para verificar si hay un tipo de archivo específico:

1) la manera segura: obtener más información acerca de la cabecera del tipo de archivo que desea pasar. analizar el archivo cargado y comparar los encabezados

2) la manera rápida: dividir el nombre del archivo en dos partes -> nombre del archivo y la finalización del archivo. echa un vistazo al final del archivo y compararlo con el tipo de archivo que desea permitir para ser subido

espero que ayude :)

1

evitan el control de Asp.Net estándar y utilizar el componente de Desarrollo NeadUpload Brettle: http://www.brettle.com/neatupload

más rápido, más fácil de usar, sin Preocuparse por el parámetro maxRequestLength en archivos de configuración y muy fácil de integrar.

3

Como algunas personas han mencionado, Javascript es el camino a seguir. Tenga en cuenta que la "validación" aquí es solo por extensión de archivo, ¡no validará que el archivo sea una hoja de cálculo Excel real!

6

Estoy de acuerdo con Chris, comprobar que la extensión no es una validación del tipo de archivo de ninguna manera que lo mires. Telerik's radUpload es probablemente su mejor opción, proporciona una propiedad ContentType del archivo que se está cargando, que puede comparar con tipos de mime conocidos. Usted debe comprobar para:

application/vnd.ms-excel,

application/excel,

application/x-msexcel

y para el nuevo formato de 2k7:

aplicación /vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik solía vender radUpload como un componente individual, pero ahora está envuelto en th e controls suite, que lo hace un poco más caro, pero de lejos es la manera más fácil de verificar el verdadero tipo

+0

según el sitio web, este servicio cuesta dinero ... – Thundter

1

Asegúrese de verificar siempre la extensión del archivo en el lado del servidor para asegurarse de que nadie pueda subir un archivo malicioso como .aspx, .asp, etc.

1

como opción alternativa, podría usar el "aceptar" atributo de la entrada de archivos HTML que define qué tipos MIME son aceptables.

Definición here

26

Es realmente simple usando validador expresión regulare.

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

Client-Side Validation of File Types Permissible to Upload

+1

Regex distingue entre mayúsculas y minúsculas por defecto. Puede desactivarlo usando (? I) para un grupo (como se indica aquí -> http://www.exampledepot.com/egs/java.util.regex/Case.html). Sin embargo, no funcionará para Javascript (como se indica aquí http://stackoverflow.com/questions/2641236/make-regular-expression-case-insensitive y probado personalmente por mí). – marquito

3

Basado en KD7 de respuesta sobre las que sugieren que compruebe si el tipo de contenido de archivos, aquí hay un método de envoltura:

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

devolver true si el archivo a subir es .xls o .xlsx

0

Como señala otro encuestado, el tipo de archivo puede ser falso (por ejemplo, .exe renombrado .pdf), lo que no impedirá la comprobación del tipo MIME (es decir, el .exe w mostrar un MIME de "application/pdf" si se renombra como .pdf). Creo que una verificación del tipo de archivo verdadero solo puede hacerse desde el servidor; una manera fácil de verificarlo usando System.IO.BinaryReader se describe aquí:

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

y la versión VB aquí:

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

Tenga en cuenta que usted necesita saber los 'códigos' binarios para el tipo de archivo (s) que' volver a verificar, pero puede obtenerlos implementando esta solución y depurando el código.

Cuestiones relacionadas