2016-12-23 1 views
0

J'ai les fichiers .xlsx, .docx et .pdf enregistrés dans mon backend. Le contrôleur de téléchargement ressemble à ceci:Les fichiers téléchargés via un contrôleur de ressort sont endommagés

@RestController 
public class FileDownload { 

@RequestMapping(value = "/files/{file_name}/", method = RequestMethod.GET, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 
public void getFile(
     @PathVariable("file_name") String file, 
     HttpServletResponse response) throws Exception { 

     String fileType=file.split("\\.")[1]; 

     switch(fileType){ 
      case "xlsx": response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
       break; 
      case "docx": response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
       break; 
      case "pdf": response.setContentType("application/pdf"); 
       break; 
      default: response.setContentType("application/octet-stream"); 
       break; 
     } 

     response.setHeader("Content-Disposition", "attachment; filename=" + file); 
     response.setHeader("Content-Length", String.valueOf(file.length())); 

     InputStream is = FileDownload.class.getResourceAsStream("/files/" + file); 

     copy(is, response.getOutputStream()); 
     response.flushBuffer(); 
} 
} 

Lorsque vous essayez d'ouvrir le fichier, Excel me dit qu'il est corrompu et doit être réparé. Le processus de réparation échoue aussi.

Ce qui pourrait être à l'origine de cette erreur?

Il y a beaucoup de questions similaires mais aucune des solutions proposées ne semble fonctionner.

La seule "correction" qui fonctionne est d'ajouter un attribut "download" au lien dans le frontend qui télécharge le fichier. Mais malheureusement, cela ne fonctionne pas pour IE.

Répondre

0

J'ai eu le même problème pour le téléchargement d'un fichier zip. Ma solution était finalement de retourner un tableau d'octets à partir de mon contrôleur (voir https://stackoverflow.com/a/33302570/4921953) puis de gérer cela sur mon frontal JavaScript de différentes manières pour Chrome/Firefox (j'ai utilisé l'attribut de téléchargement que vous avez utilisé) et Internet Explorer (voir https://stackoverflow.com/a/24354303/4921953). Assurez-vous que responseType est défini sur "arraybuffer" lorsque vous effectuez la requête HTTP à partir du frontal vers votre serveur.