La configuration de Spring MVC contrôleur pour envoyer des fichier client
Je pense que mon scénario est assez commun. J'ai une base de données et je veux que mon Spring MVC
application à accepter une demande dans le contrôleur, il faut appeler la DB de service pour obtenir les données et envoyer des données au client en tant que fichier CSV. Je suis à l'aide de la JavaCSV
bibliothèque trouvé là pour les aider dans le processus: http://sourceforge.net/projects/javacsv/
J'ai trouvé plusieurs exemples de gens qui font des choses similaires et bricolé quelque chose qui semble correct-ish. Quand j'ai frappé la méthode, cependant, rien de ce qui se passe vraiment.
Je pensais que l'écriture de données sur le HttpServletResponse
's outputStream serait suffisant, mais apparemment, je suis en manque de quelque chose.
Voici mon code de contrôleur:
@RequestMapping(value="/getFullData.html", method = RequestMethod.GET)
public void getFullData(HttpSession session, HttpServletRequest request, HttpServletResponse response) throws IOException{
List<CompositeRequirement> allRecords = compReqServ.getFullDataSet((String)session.getAttribute("currentProject"));
response.setContentType("data:text/csv;charset=utf-8");
response.setHeader("Content-Disposition","attachment; filename=\yourData.csv\"");
OutputStream resOs= response.getOutputStream();
OutputStream buffOs= new BufferedOutputStream(resOs);
OutputStreamWriter outputwriter = new OutputStreamWriter(buffOs);
CsvWriter writer = new CsvWriter(outputwriter, '\u0009');
for(int i=1;i <allRecords.size();i++){
CompositeRequirement aReq=allRecords.get(i);
writer.write(aReq.toString());
}
outputwriter.flush();
outputwriter.close();
};
Ce qui me manque ici? Fondamentalement, l'effet net est... rien. J'aurais pensé que le réglage de l'en-tête de type de contenu et serait la cause de mon navigateur pour revenir sur la réponse et de déclencher le téléchargement d'un fichier à l'action.
- Trouvé le problème. J'ai essayé de traiter les données de réponse quand il était déjà dans le format correct. Le code ci-dessus fonctionne lorsque le site tout simplement hrefs à getFullData.html. En bref, rien à voir ici...se déplacer le long :):)
Vous devez vous connecter pour publier un commentaire.
Il semble être à cause de votre type de Contenu est mal réglé, il doit être
response.setContentType("text/csv;charset=utf-8")
au lieu deresponse.setContentType("data:text/csv;charset=utf-8")
.En outre, si vous utilisez le Printemps 3, vous devriez probablement utiliser un @ResponseBody HttpMessageConverter pour la réutilisation du code. Par exemple:
Dans le contrôleur:
plus un simple HttpMessageConverter:
et un objet simple de lier le tout ensemble:
@RequestMapping
balise unproduces = "text/csv"
plutôt qu'unconsumes
? Il est la production de données pour le client de ne pas en consommer.<annotation-driven> <message-converters> <beans:bean class="blah.blah.blah.export.CsvMessageConverter" /> </message-converters> </annotation-driven>
Pierre de réponse, j'ai fait un convertisseur. Voici le code complet, qui fonctionne avec n'importe quel Objet passé:
TsvMessageConverter.java
TsvResponse.java
Et sur SpringContext.xml ajoutez la ligne suivante:
Vous pouvez utiliser sur votre contrôleur comme ceci: