2011-08-24 26 views
5

Estoy usando la capacidad de Spring 3 para cargar un archivo. Me gustaría saber la mejor manera de validar que un archivo es de cierto tipo, específicamente un archivo csv. Estoy bastante seguro de que no es útil verificar la extensión y actualmente estoy verificando el tipo de contenido del archivo que se carga. Solo me aseguro de que sea del tipo "text/csv". Y solo para aclarar que este es un archivo cargado por el cliente, lo que significa que no tengo control de sus orígenes.Spring MVC Upload File - ¿Cómo es el tipo de contenido?

Tengo curiosidad por cómo Spring/el navegador determina cuál es el tipo de contenido? ¿Es esta la mejor/más segura forma de determinar qué tipo de archivo se ha subido? ¿Puedo estar 100% seguro?

ACTUALIZACIÓN: De nuevo, no me pregunto cómo determinar cuál es el tipo de contenido de un archivo sino cómo se determina el tipo de contenido. ¿Cómo sabe spring/the browser que el tipo de contenido es un "texto/csv" basado en el archivo cargado?

+0

Tenía el mismo problema. ¿Por qué Spring no admite la opción "Determinado desde el contenedor" como en los archivos java usuales? Si configuro la codificación en mi módulo maven como UTF-8, espero que mis archivos tengan esta codificación por defecto y no necesite cambiar manualmente – borjab

Respuesta

1

Puede utilizar

org.springframework.web.multipart.commons.CommonsMultipartFile objeto.

tiene el método getContentType();.

Mira el siguiente ejemplo http://www.ioncannon.net/programming/975/spring-3-file-upload-example/

puede simplemente añadir el simple prueba en el objeto CommonsMultipartFile y redirigir a página de error si el tipo de contenido es incorrecto.

+0

. Creo que no entienden bien mi pregunta. Sé sobre getContentType() y ya lo estoy usando. La pregunta es ¿cómo se determina ese tipo de contenido? Estoy teniendo un debate con un colega y él piensa que el tipo de contenido no es más útil que la extensión, ya que se puede establecer arbitrariamente a cualquier cosa. Pero tengo curiosidad por saber cómo Spring/el navegador dice que este archivo es un "texto/csv". El propósito de esto es rechazar un archivo que no es un verdadero archivo csv, ¿cómo puedes estar seguro de que es así? – sauce

0

Por qué no acaba de tomar el nombre del archivo en el que validador, que se dividió, el tipo de archivo es fileName.split ("\"). [Filename.length() - 1] cadena

+0

Las extensiones de archivo son esencialmente inútiles, es una mirada en la dirección correcta, pero no va a cortarla. Puede tener un archivo sin extensión que sea realmente un archivo CSV y de alguna manera el navegador/Spring sabe qué tipo de archivo es. Me pregunto cómo lo sabe. – sauce

1

Por lo que también puede contar el número de comas en el archivo por línea. Normalmente debe haber la misma cantidad de comas en cada línea del archivo para que sea un archivo CSV válido.

+0

No es una mala idea para archivos pequeños ... pero archivos con 100k líneas probablemente no sean prácticos para revisarlos todos. Supongo que podrías consultar las primeras 10 líneas o algo así.No es exactamente lo que estaba buscando, sino solo otra forma de validarlo manualmente. Solo desearía saber que puedo confiar en que el tipo de contenido se configure correctamente. – sauce

0

Ok, en este caso sugiero que use la biblioteca de Csvreader java. Solo tienes que verificar tu objeto csvreader y eso es todo.

0

Hasta donde yo sé, el método getContentType(String) obtiene su valor de lo que sea que el agente del usuario lo indique, por lo que tiene razón en ser cauteloso ya que esto puede ser fácilmente falsificado.

Para archivos binarios, puede consultar el magic number o utilizar una biblioteca, como mime-util o jMimeMagic. También hay Files.probeContentType(String) desde Java 7 pero solo funciona con archivos en el disco y se han reportado errores en algunos sistemas operativos.

Cuestiones relacionadas