2013-07-03 4 views
1

J'ai une sorcière de servlet génère un fichier .xls et il est d'envoyer le fichier généré à l'utilisateur pour télécharger le code ci-dessous:question réponse servlet étrange

// Write the output to a file 
Calendar currentDate = Calendar.getInstance(); 
SimpleDateFormat formatter= 
new SimpleDateFormat("yyyy_MMM_dd"); 
String dateNow = formatter.format(currentDate.getTime()); 

String path = "webapps/myapp/exports/"; 
String fileName = ("Table_export_"+ dateNow + ".xls"); 

FileOutputStream fileOut = new FileOutputStream(path+fileName); 
wb.write(fileOut); 
fileOut.close(); 
response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition","attachment;filename="+fileName); 

Le fichier est enregistré sur le serveur avec un taille de 5 Ko, mais après la boîte de dialogue du navigateur et après avoir choisi enregistrer ou ouvrir, le fichier est vide et la taille est de 0 kb. Je ne peux pas comprendre ce qui ne va pas.

Je me bats avec ce problème pendant environ 2 heures sans succès. J'ai essayé de définir le chemin complet:

response.setHeader("Content-Disposition","attachment;filename="path+fileName); 

Mais je suis arrivé un document avec un nom étrange et il était aussi 0 kb. Je suis assez sûr qu'il me manque quelque chose de vraiment petit, mais en tant que développeur junior, je ne peux toujours pas comprendre.

+1

Vous essayez d'envoyer le fichier dans la réponse HTTP ou quoi? Désolé je ne peux pas comprendre votre code. – Rafa

+0

oui, c'est ce que j'essaie de faire. – Slim

+1

Mais vous enregistrez le fichier dans le système de fichiers à la place! Si vous voulez envoyer un fichier via HTTP, vous devez écrire des octets dans 'OutputStream' que vous obtenez à partir de la réponse HTTP. – AlexR

Répondre

2

Puisque vous avez déjà une méthode qui peut écrire votre fichier à un flux de sortie, vous pouvez simplement changer votre code de cette façon de l'envoyer à l'utilisateur:

Calendar currentDate = Calendar.getInstance(); 
SimpleDateFormat formatter = new SimpleDateFormat("yyyy_MMM_dd"); 
String dateNow = formatter.format(currentDate.getTime()); 

String fileName = ("Table_export_"+ dateNow + ".xls"); 

response.setContentType("application/vnd.ms-excel"); 
response.setHeader("Content-Disposition","attachment;filename="+fileName); 

OutputStream outputStream = response.getOutputStream(); 
try { 
    wb.write(outputStream); 
} finally { 
    outputStream.close(); 
} 

Il ne sera pas sauvegardé sur votre serveur HDD cependant. La méthode HttpServletResponse#getOutputStream() vous permet d'accéder au flux d'octets qui sera renvoyé au client.

+0

MERCI donc mutch !!! C'est exactement ce que je cherchais! Tu gères! Merci encore! – Slim

0

Lorsque vous avez utilisé le format -

String path = "webapps/myapp/exports/"; 
String fileName = ("Table_export_"+ dateNow + ".xls"); 
... 
response.setHeader("Content-Disposition","attachment;filename="path+fileName); 

était le nom de fichier "webapps% 2Fmyapps% 2Fexports% 2fTable_export _.... xls"?

Als la taille du fichier aurait été nul parce que vous ne mettez pas toutes les données dans le fichier