2017-08-29 1 views
0

Mon application Web exécute Tomcat 8. Un fichier .docx est correctement téléchargé sur le serveur et téléchargé à l'aide du code java suivant contenu dans un fichier jsp.Le téléchargement Java corrompt le fichier .docx en ajoutant un caractère

File f = new File (Monitor.getPropertyValue("myDir") + (request.getParameter("file"))); 

    String filename=request.getParameter("original"); 
    response.setContentLength((int) f.length()); 
    response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessing‌​ml.document"); 

    response.setHeader ("Content-Disposition", "attachment; filename="+filename); 
    InputStream in = new FileInputStream(f); 
    ServletOutputStream outs = response.getOutputStream(); 


    int bit = 256; 
    int i = 0; 
    try { 
    while ((bit) >= 0) { 
    bit = in.read(); 
    outs.write(bit); 
        } 
     } 
     catch (IOException ioe) { 
       ioe.printStackTrace(System.out); 
      } 
    outs.flush(); 
    outs.close(); 
    in.close(); 

Cependant quand je tente d'ouvrir le fichier téléchargé, il est corrompu et Word ne l'ouvrir (sans le fixer en premier)

Quand je comparais le fichier original et le fichier téléchargé puis j'ai remarqué que le fichier téléchargé a un caractère supplémentaire à la fin - FF (hex)

Si je supprime ce caractère supplémentaire avec un éditeur hexadécimal, le fichier ouvre bien.

Pourquoi ce caractère supplémentaire a-t-il été ajouté?

+0

Vous ne devriez pas utiliser un 'JSP' pour télécharger un fichier binaire. Ecrivez une servlet à la place. – Xvolks

+0

Je sais - c'est un vieux code que je n'ai pas écrit. Pensez-vous que c'est la source du problème, ou suggérez-vous simplement de bonnes pratiques de programmation? – gordon613

+0

Bonne pratique. J'ai déjà fait des choses laides comme ça dans le passé et j'ai appris à la dure à ne pas le faire. – Xvolks

Répondre

4

Votre boucle est erronée. Après que le dernier octet réel est écrit, bit le contient encore, la boucle est entrée, in.read() lit -1 et l'écrit, résultant en l'octet supplémentaire 0xFF (c'est-à-dire -1).

Changez votre boucle pour vérifier ce qui est lu avant de l'écrire comme suit

while((bit = in.read()) != -1) { 
    outs.write(bit); 
}