Estrictamente hablando, la respuesta es no . Un desarrollador no puede evitar que un usuario cargue archivos de ningún tipo o extensión.
Pero aún así, el atributo accept de <input type = "file">
puede ayudar a proporcionar un filtro en el cuadro de diálogo de selección de archivos del sistema operativo. Por ejemplo,
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox 42+) -->
<input type="file" accept=".xls,.xlsx" />
debería proporcionar una forma de filtrar archivos que no sean .xls o .xlsx. Aunque la página MDN para input
element siempre dijo que es compatible con esto, para mi sorpresa, esto no funcionó para mí en Firefox hasta la versión 42. Esto funciona en IE 10+, Edge y Chrome.
Entonces, para admitir Firefox anterior a 42 junto con IE 10+, Edge, Chrome y Opera, supongo que es mejor usar una lista de tipos MIME separados por comas:
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox) -->
<input type="file"
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" />
Comportamiento [ Edge (EdgeHTML): el menú desplegable de filtro de tipo de archivo muestra los tipos de archivo mencionados aquí, pero no es el predeterminado en el menú desplegable. El filtro predeterminado es All files (*)
.]
También puede usar asteriscos en tipos MIME. Por ejemplo:
<input type="file" accept="image/*" /> <!-- all image types -->
<input type="file" accept="audio/*" /> <!-- all audio types -->
<input type="file" accept="video/*" /> <!-- all video types -->
W3C recomienda a los autores que especifiquen los tipos MIME y las extensiones correspondientes en el accept
atributo. Entonces, el mejor enfoque es:
<!-- Right approach: Use both file extensions and corresponding MIME-types. -->
<!-- (IE 10+, Edge (EdgeHTML), Edge (Chromium), Chrome, Firefox) -->
<input type="file"
accept=".xls,.xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel" />
JS Violín de lo mismo: aquí .
Referencia: Lista de tipos MIME
IMPORTANTE: el uso del accept
atributo solo proporciona una forma de filtrado en los archivos de tipos que son de interés. Los navegadores aún permiten a los usuarios elegir archivos de cualquier tipo. Se deben realizar verificaciones adicionales (del lado del cliente) (usando JavaScript, una forma sería esta ), y definitivamente los tipos de archivo DEBEN verificarse en el servidor , usando una combinación de tipo MIME usando la extensión del archivo y su firma binaria ( ASP .NET , PHP , Ruby , Java ). También puede consultar estas tablas para conocer los tipos de archivos y sus números mágicos., para realizar una verificación más sólida del lado del servidor.
Aquí hay tres buenas lecturas sobre la carga de archivos y la seguridad.
EDITAR: Quizás la verificación del tipo de archivo usando su firma binaria también se puede hacer en el lado del cliente usando JavaScript (en lugar de solo mirar la extensión) usando la API de archivos HTML5, pero aún así, el archivo debe ser verificado en el servidor, porque un usuario malintencionado aún podrá cargar archivos haciendo una solicitud HTTP personalizada.