it-swarm-es.tech

¿Cómo valido el tipo de archivo de una carga de archivos?

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: limitar a las extensiones de archivo .xls o .xlsx).

Tanto JavaScript como la validación del lado del servidor están bien (siempre que la validación del lado del servidor se realice antes de que se carguen los archivos; podría haber algunos archivos muy grandes cargados, por lo que cualquier validación debe realizarse antes de que se carguen los archivos reales) .

36
Yaakov Ellis

Parece que tendrá opciones limitadas, ya que desea que la verificación se realice antes de la carga. Creo que lo mejor que obtendrás es usar javascript para validar la extensión del archivo. Puede crear un hash de extensiones válidas y luego ver si la extensión del archivo que se está cargando existía 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;
      }
}
30
Jamie

Es bastante simple usar el validador de expresiones regulares.

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

Validación del lado del cliente de los tipos de archivo permitidos para cargar

26
shailesh

Desde javascript, debería poder obtener el nombre de archivo en el controlador de envío. Entonces, en su caso, 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>
6
staktrace

Estoy de acuerdo con Chris, comprobar que la extensión no es una validación del tipo de archivo de ninguna manera. RadUpload de Telerik es probablemente su mejor opción, proporciona una propiedad ContentType del archivo que se está cargando, que puede comparar con los tipos MIME conocidos. Debes verificar si:

application/vnd.ms-Excel,

aplicación/Excel,

aplicación/x-msexcel

y para el nuevo formato 2k7:

application/vnd.openxmlformatsofficedocument.spreadsheetml.sheet

Telerik solía vender radUpload como un componente individual, pero ahora está incluido en el conjunto de controles, lo que lo hace un poco más caro, pero es la forma más fácil de verificar el tipo verdadero.

6
kd7

Puede usar un validador de expresiones regulares 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 de aceptación de la etiqueta de entrada:

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

pero no tuve mucho éxito cuando probé esto (con FF3 e IE7)

4
AlexWilson

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 verdadera hoja de cálculo de Excel!

3
Jonathan Arkell

Según la respuesta de kd7 que sugiere que verifique el tipo de contenido de los 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;
}

devuelve verdadero si el archivo a cargar es .xls o .xlsx

3
m_cheung

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

2
dr. evil

Bueno, no podrá hacerlo en el lado del servidor en la devolución de datos, ya que el archivo se enviará (subirá) durante la devolución.

Creo que puede hacerlo en el cliente usando JavaScript. Personalmente, uso 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 cargas de archivos grandes.

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

1
Chris Roberts

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

Definición aquí

1
chillysapien

Evite el control Asp.Net estándar y use el componente NeadUpload de Brettle Development: http://www.brettle.com/neatupload

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

1
massimogentilini

Creo que hay diferentes formas de hacer esto. Como no estoy familiarizado con asp, solo puedo darle algunos consejos para verificar un tipo de archivo específico:

1) la forma segura: obtenga más información sobre el encabezado del tipo de archivo que desea pasar. analizar el archivo cargado y comparar los encabezados

2) la forma rápida: dividir el nombre del archivo en dos partes -> nombre del archivo y el final del archivo. compruebe el final del archivo y compárelo con el tipo de archivo que desea permitir que se cargue

espero eso ayude :)

1
DeeCee

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 generalmente está dictado por la extensión del archivo.

use un Framework JavaScript como jQuery para sobrecargar el evento onsubmit del formulario. Luego verifique la extensión. Esto limitará la mayoría de los intentos. Sin embargo, si una persona cambia una imagen a la extensión XLS, 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.

0
Nick Berardi

Como señala otro encuestado, el tipo de archivo puede ser falsificado (p. Ej., .Exe renombrado .pdf), lo que no impedirá la verificación del tipo MIME (es decir, el .exe mostrará un MIME de "aplicación/pdf" si se renombra como. pdf). Creo que una verificación del tipo de archivo verdadero solo se puede hacer del lado del servidor; Aquí se describe una manera fácil de verificarlo utilizando System.IO.BinaryReader:

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

y VB versión aquí:

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

Tenga en cuenta que necesitará conocer los 'códigos' binarios para los tipos de archivo que está buscando, pero puede obtenerlos implementando esta solución y depurando el código.

0
Mark_fsg

Comprobación de validación del lado del 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