2010-08-08 22 views
2

J'écris un serveur de fichiers statiques rapide et sale à l'aide de Jetty. Je dois définir le type de contenu pour chaque réponse:HttpServletRequest: Comment déterminer le type de contenu de l'actif demandé

HttpServletResponse.setContentType("content/type"); 

Pour une demande de fichier donné, comment puis-je déterminer de façon fiable ce type de contenu pour définir? Est-ce une question d'examen de l'extension de fichier ou existe-t-il une méthode plus sophistiquée? (Par exemple, s'il n'y a pas d'extension de fichier ou l'extension ne reflète pas le type de contenu?)

Merci Richard

+0

Je sais que deux solutions: - [javax.activation.MimetypesFileTypeMap] (http://download-llnw.oracle.com/javase/6/docs/api/javax/activation/MimetypesFileTypeMap.html) du cadre d'activation JavaBeans (semble disponible dans Java SE 6?!) - [Apache Tika] (http://tika.apache.org/) Un [tutoriel intéressant] (http://www.rgagnon.com/javadetails/java-0487.html) à propos de ce sujet avec beaucoup de différentes solutions, je n'ai pas essayé. – Kartoch

+0

Vous devriez regarder dans cette bibliothèque. Il fait beaucoup de choses (extensions de fichiers, données magiques et reniflage de contenu) pour déterminer le type de contenu: [Mime Type Detection Utility] (http://sourceforge.net/projects/mime-util/) – naikus

+0

Vous ne savez pas si cela correspond vos besoins, mais j'ai récemment publié mon paquet [SimpleMagic] (http://256.com/sources/simplemagic/) qui implémente la même fonctionnalité que la commande de fichier Unix (1). Il utilise des fichiers de configuration internes ou peut lire '/ etc/magic',// ​​usr/share/fichier/magic', ou d'autres fichiers magic (5) et déterminer le contenu du fichier' File', 'InputStream', ou' byte [] '. L'emplacement des [sources github] (https://github.com/j256/simplemagic), javadocs, et de la documentation sont disponibles sur la [page d'accueil] (http://256.com/sources/simplemagic/). Avec SimpleMagic, vous faites quelque chose comme le – Gray

Répondre

1

Ne pouvez-vous vérifier que la demande Content-Type et définir la réponse à cela?

Je ne connais pas le type de clients que vous envisagez de prendre en charge, mais si ce sont des navigateurs, je suppose que cela devrait vous convenir. Si vous contrôlez les clients, c'est une bonne pratique qu'ils vous envoient cet en-tête de toute façon.

Bonne chance!

+0

Le client que je supporte ne sont que des navigateurs. C'est une suggestion intéressante, je vais enquêter. –

0

Puisque vous utilisez l'objet HttpServletResponse dans votre question, je suppose que vous avez le ServletContext à votre disposition dans vos Contrôleurs. Je viens de résoudre ce même problème en utilisant simplement les méthodes disponibles à partir du servletContext.

Puisque vous écrivez un serveur de fichiers, vous pouvez simplement passer le chemin d'accès au fichier dans la méthode getMimeType du ServletContext, et il devrait renvoyer le mimeType, s'il peut le déterminer.

String path = "/js/example.js"; 
String mimeType = getServletContext().getMimeType(path); 
resp.setContentType(mimeType); // HttpServletResponse object 

REMARQUE: permet de définir le type de contenu "application-x/javascript" dans cet exemple particulier.

Informations complémentaires: Je crois que cette solution suppose également vos fichiers sont stockés dans un endroit accessible au ServletContext. Si non, alors l'une des autres solutions pourrait être la meilleure.