2009-10-21 30 views
115

Tengo un formulario con capacidades de carga de archivos y me gustaría poder tener algunos buenos informes de errores del lado del cliente si el archivo que el usuario está tratando de cargar es demasiado grande, ¿hay alguna manera de verificar el tamaño del archivo con jQuery? ya sea puramente en el cliente o de alguna manera publicar el archivo de nuevo en el servidor para comprobar?¿Cómo verificar el tamaño de entrada del archivo con jQuery?

Respuesta

238

En realidad, no tiene acceso al sistema de archivos (por ejemplo, leer y escribir archivos locales), sin embargo, debido a la especificación HTML5 File Api, hay algunas propiedades de archivo a las que tiene acceso y el tamaño del archivo es uno de ellos.

Para el HTML

<input type="file" id="myFile" /> 

pruebe lo siguiente:

//binds to onchange event of your input field 
$('#myFile').bind('change', function() { 

    //this.files[0].size gets the size of your file. 
    alert(this.files[0].size); 

}); 

Como se trata de una parte de la especificación de HTML 5, que sólo funcionará para los navegadores modernos (v10 requeridos para IE) y He añadido here más detalles y enlaces sobre otros archivos de información que debe saber: http://felipe.sabino.me/javascript/2012/01/30/javascipt-checking-the-file-size/


navegadores viejos apoyan

Tenga en cuenta que los navegadores antiguos volverán un valor null para la this.files llamada anterior, por lo que el acceso a this.files[0] lanzará una excepción y que debiera check for File API support antes de usarlo

+6

Todo el mundo dice que esto no se puede hacer, pero aquí está. Esto funciona. Lo probé – Peter

+13

no funcionará en ie8. –

+32

@Jeroen Estoy de acuerdo en que no trabajar para IE hace que no sea la solución ideal para mucha gente, ¿pero no da un voto negativo y dice que la respuesta es inútil demasiado? Utilicé esta solución en una gran variedad de soluciones web empresariales que tenían el alcance de la necesidad de trabajar solo en Chrome y/o Firefox, y algunas personas que buscan esta solución podrían estar en el mismo lugar, por lo que esta solución será lo suficientemente buena . –

1

Puede hacer este tipo de comprobación con Flash o Silverlight pero no con Javascript. El sandbox de javascript no permite el acceso al sistema de archivos. El control de tamaño debería hacerse en el servidor después de que se haya cargado.

Si desea ir a la ruta Silverlight/Flash, puede verificar si no están instalados de forma predeterminada a un controlador de carga de archivos normal que utiliza los controles normales. De esta forma, si tienen instalado Silverlight/Flash, su experiencia será un poco más rica.

36

Si desea utilizar jQuery de validate que pueda mediante la creación de este método:

$.validator.addMethod('filesize', function(value, element, param) { 
    // param = size (en bytes) 
    // element = element to validate (<input>) 
    // value = value of the element (file name) 
    return this.optional(element) || (element.files[0].size <= param) 
}); 

usted podría utilizarlo:

$('#formid').validate({ 
    rules: { inputimage: { required: true, accept: "png|jpe?g|gif", filesize: 1048576 }}, 
    messages: { inputimage: "File must be JPG, GIF or PNG, less than 1MB" } 
}); 
+1

Esto no funciona con IE – Dan

+1

@Dan sí, la propiedad de tamaño de archivo es una parte del Especificación HTML5, por lo que solo funcionará para los navegadores modernos (para IE sería la versión 10+) –

+6

Ha utilizado incorrectamente la regla 'accept', donde debería haber usado la regla' extension'. ~ [La regla 'accept'] (http://jqueryvalidation.org/accept-method/) es solo para tipos MIME. [La regla 'extensión'] (http://jqueryvalidation.org/extension-method/) es para extensiones de archivo. También necesita incluir [el archivo 'additional-methods.js'] (http://cdn.jsdelivr.net/jquery.validation/1.13.1/additional-methods.js) para estas reglas. – Sparky

19

este código:

$("#yourFileInput")[0].files[0].size; 

Devuelve el tamaño del archivo para una entrada de formulario.

En FF 3.6 y más tarde este código debe ser:

$("#yourFileInput")[0].files[0].fileSize; 
+2

Tu primer código funciona en cromo, pero el segundo no funciona para Firefox más reciente. –

+1

primer código que funciona bien en FireFox. – Dhwani

+0

Ese segundo código es lo que tuve que usar para todos los navegadores modernos (2014+). – Dreamcasting

11

Estoy publicar mi solución también se usa para una FileUpload control de ASP.NET. Quizás alguien lo encuentre útil.

$(function() {   
    $('<%= fileUploadCV.ClientID %>').change(function() { 

     //because this is single file upload I use only first index 
     var f = this.files[0] 

     //here I CHECK if the FILE SIZE is bigger than 8 MB (numbers below are in bytes) 
     if (f.size > 8388608 || f.fileSize > 8388608) 
     { 
      //show an alert to the user 
      alert("Allowed file size exceeded. (Max. 8 MB)") 

      //reset file upload control 
      this.value = null; 
     } 
    }) 
}); 
+1

Necesita anular la comprobación del valor de 'f = this.files [0]' o esto fallará en los navegadores más antiguos. p.ej. 'if (f && (f.size> 8388608 || f.fileSize> 8388608))' –

0
<form id="uploadForm" class="disp-inline" role="form" action="" method="post" enctype="multipart/form-data"> 
    <input type="file" name="file" id="file"> 
</form> 
<button onclick="checkSize();"></button> 
<script> 
    function checkSize(){ 
     var size = $('#uploadForm')["0"].firstChild.files["0"].size; 
     console.log(size); 
    } 
</script> 

Me pareció que para ser el más fácil si usted no planea enviado el formulario a través norma ajax/html5 métodos, pero por supuesto que funciona con cualquier cosa.

NOTAS:

var size = $('#uploadForm')["0"]["0"].files["0"].size; 

Esta utilizan para trabajar, pero no es así en cromo más, Acabo de probar el código anterior y funcionó tanto en FF y cromo (lastest). El segundo ["0"] ahora es firstChild.

Cuestiones relacionadas