Java HttpServlet comment télécharger fichier excel
Je suis en train d'ajouter une fonction à mon application web qui permet aux utilisateurs de télécharger un fichier excel.
Je suis en train de réaliser avec le code suivant:
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) {
File file = new File("d:/test/test.xls");
response.setContentType("application/xls");
response.addHeader("Content-Disposition", "attachment; filename=test.xls");
response.setContentLength((int) file.length());
try {
FileInputStream fileInputStream = new FileInputStream(file);
OutputStream responseOutputStream = response.getOutputStream();
int bytes;
while ((bytes = fileInputStream.read()) != -1) {
responseOutputStream.write(bytes);
}
fileInputStream.close();
responseOutputStream.close();
} catch (FileNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
Je suis en mesure de télécharger le fichier excel avec le code ci-dessus, cependant, le fichier est corrompu. Si je l'ouvre avec microsoft excel, j'obtiens une fenêtre avec le message:
"le format de fichier et l'extension de la ne correspondent pas. le fichier peut être endommagé ou dangereux".
Et le fichier excel est vide.
Après l'exécution du code, le fichier d'origine(d:/test/test.xls) obtient également endommagé.
Ce que je fais mal?
- Êtes-vous sûr que le fichier excel est valide avant de l'attemting le télécharger? Peut-être que c'est déjà endommagé avant que le processus?
- Oui j'en suis sûr à ce sujet.
- Eh bien, une chose est sûre, le code que vous avez posté ne doute pas de la modifier ou de corrompre votre fichier Excel.
- Quelle est la taille de votre fichier? Il est très grand, peut-être?
- Pourquoi ne pas lire le fichier en tant que morceau au lieu de par octets? Quelque chose comme this.
- Attendez une seconde, le fichier d'origine est corrompu? Quelque chose d'autre doit être corrompant, puis la servlet envoyé le fichier corrompu.
- Avez-vous résolu ce problème maintenant? Je rencontre le même problème maintenant.
Vous devez vous connecter pour publier un commentaire.
Officiel de type MIME pour les fichiers Excel
.xls
estapplication/vnd.ms-excel
et pour.xlsx
estapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.Aussi, je voudrais suggérer de faire
response.reset()
avant d'écrire pour le flux de sortie etresponseOutputStream.flush()
(important) avant la clôture de laresponse
.Essayer de code ci-dessous :
ne pas oublié d'ajouter apache commons-io-2.4 dans votre dépendance à l'