Pregunta

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

Ambos JavaScript o validación del lado del servidor están bien (siempre que el servidor de validación del lado tendría lugar antes de que los archivos se cargan - podría haber algunos muy grandes los archivos subidos, por lo que cualquier validación debe tener lugar antes de que los archivos se cargan).

¿Fue útil?

Solución

Parece que vamos a tener opciones limitadas ya que desea que la comprobación de producirse antes de la carga.Creo que la mejor que vas a conseguir es el uso de javascript para validar la extensión del archivo.Se podría construir un hash de las extensiones válidas y, a continuación, mira a ver si la extensión del archivo subido que 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;
      }
}

Otros consejos

Es bastante simple de usar regulare expresión validador.

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

Validación por parte del cliente de Tipos de Archivo Permitido para Subir

Desde javascript, usted debería ser capaz de obtener el nombre de archivo en el onsubmit controlador.Así que, 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>

Estoy de acuerdo con Chris, la comprobación de la extensión no es la validación del tipo de archivo de cualquier manera que se mire. Telerik del radUpload es probablemente su mejor opción, proporciona una propiedad ContentType del archivo que se carga, que se puede comparar a los conocidos de los tipos mime.Usted debe comprobar:

application/vnd.ms-excel,

aplicación de excel,

application/x-msexcel

y para el nuevo 2k7 formato:

application/vnd.openxmlformatsofficedocument.spreadsheetml.hoja de

Telerik que se usa para vender radUpload como un componente individual, pero ahora su envueltos dentro de la suite de controles, lo que hace que sea un poco más caro, pero por el momento sus la forma más sencilla para comprobar el tipo real

Usted podría utilizar una expresión regular validador 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 está el aceptar atributo de la etiqueta de entrada:

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

pero no tuve mucho éxito cuando lo probé (con FF3 y IE7)

Como algunas personas han mencionado, Javascript es el camino a seguir.Tenga en cuenta que la "validación" aquí es sólo por la extensión del archivo, no va a validar que el archivo es una verdadera hoja de cálculo de excel!

Basado en rd7 la respuesta de sugerir que compruebe si los archivos de tipo de contenido, aquí es un contenedor método:

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 true si el archivo a subir es .xls o .xlsx

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

Bien, usted no será capaz de hacerlo del lado del servidor en el post-back como el archivo se presentó (cargado) durante el post-back.

Creo que usted puede ser capaz de hacerlo en el cliente con JavaScript.Personalmente, yo uso un tercer componente de la parte llamada radUpload por Telerik.Tiene una buena lado cliente y del lado del servidor de la API, y proporciona una barra de progreso para las grandes subidas de archivos.

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

Creo que hay maneras diferentes de hacer esto.Ya que no estoy familiarizado con asp sólo puedo dar algunos consejos para buscar un tipo de archivo específico:

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

2) la forma rápida:dividir el nombre del archivo en dos piezas -> nombre del archivo y el final del archivo.retirar el final del archivo y compararlo con el tipo de archivo que desea permitir para ser subido

espero que ayude :)

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

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

Como alternativa, puede utilizar la "aceptar" atributo de HTML de la Entrada de Archivo que define los tipos MIME son aceptables.

Definición aquí

Su única opción parece ser la validación del cliente, debido a que el lado del servidor significa que el archivo ya estaba subido.También el tipo MIME es generalmente dictada por la extensión de archivo.

utilizar un Framework JavaScript como jQuery a una sobrecarga del evento onsubmit del formulario.A continuación, comprobar la extensión.Esto limitará la mayoría de los intentos.Sin embargo, si una persona cambia de una imagen a la extensión XLS, a continuación, usted tiene un problema.

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

Como otro participante, notas, el tipo de archivo puede ser falso (por ejemplo, .exe cambiado de nombre .pdf), que la comprobación de la tipo MIME no va a impedir (es decir, la .exe mostrará un mimo de "application/pdf" si renombrado como .pdf).Yo creo que un cheque de la verdadera tipo de archivo sólo puede hacerse de lado del servidor;una forma sencilla de comprobar que el uso del Sistema.IO.BinaryReader se describe a continuación:

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

y la versión de VB aquí:

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

Tenga en cuenta que usted necesitará saber el binario "códigos" para el tipo de archivo(s) que usted está comprobando, pero se pueden conseguir mediante la implementación de esta solución y depurar el código.

Lado Del Cliente La Comprobación De Validación:-

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top