2017-03-07 1 views
1

J'utilise Jhipster. J'utilise docx4j pour créer un fichier .docx.Envoyer le fichier .docx du serveur au client dans l'application jhipster

Je veux télécharger ce fichier .docx du serveur au client.

Mais le fichier que je télécharge est corrompu.

côté serveur:

je produis mon dossier et le mettre dans un octet []

WordprocessingMLPackage p = null; 
... 
File f = new File(filePath); 
p.save(f); 
byte[] stream = Files.readAllBytes(f.toPath()); 

J'ai essayé de l'envoyer au client dans un format différent:

octet []

octet [] encodé Base64

Chaîne

chaîne base64

Un exemple de ce qui ressemblent à ma méthode:

// send back as String encoded in Base64 
public ResponseEntity<FileDTO> getFile(@PathVariable Long id) throws URISyntaxException, IOException { 
    FileDTO result = fillRepository.findOne(id); 
    byte[] stream = FileUtil.getFile(id) // retrieve file as byte[] 
    byte[] encoded = Base64.encodeBase64(stream); 
    String encodedString = new String(encoded, "UTF-8"); 
    result.setFile(encodedString); 
    return ResponseUtil.wrapOrNotFound(Optional.ofNullable(result)); 
} 

côté client:

Je récupère mon dossier comme octet [] ou chaîne et je l'ai mis dans un blob à télécharger.

FileService.get({id: id}, function(result) { 
    var res = result.file; 
    // var res = Base64.decode(result.file); 
    vm.blob = new Blob([res], {type: 'data:attachment;charset=utf-8;application/vnd.openxmlformats-officedocument.wordprocessingml.document'}); 
    vm.url = (window.URL || window.webkitURL).createObjectURL(vm.blob); 
}); 

Mon service est déclarée comme ceci:

(function() { 
    'use strict'; 
    angular 
     .module('myApp') 
     .factory('FileService', FileService); 
    FileService.$inject = ['$resource', 'DateUtils']; 
    function FileService($resource, DateUtils) { 
     var resourceUrl = 'api/file/:id/generate'; 
     return $resource(resourceUrl, {}, { 
      'get': { 
       method: 'GET', 
       responseType:'arraybuffer' 
}});}})(); 

Lorsque je télécharge le mot de fichier dire:.

« Nous sommes désolés Nous ne pouvons pas ouvrir file.docx parce que nous avons trouvé un problème avec son contenu. "

Et quand je compare mon fichier original et celui téléchargé dans notepad ++ par exemple, je vois que le contenu binaire est pas exactement le même comme il y avait des problèmes encode/decode ...

Aussi la taille ne sont pas les mêmes :

fichier original 13Ko

fichier téléchargé 18Ko

Pourriez-vous me aider à savoir comment et pourquoi le fichier téléchargé est corrompu.

Répondre

1

J'ai finalement trouvé une solution:

J'envoie directement vers le binaire sans convertion dans la réponse. Et accédez-y avec une fenêtre.emplacement

I, un nouveau contrôleur de repos sans annotation: @RequestMapping("/api")

@RestController 
public class FileGenerationResource { 
    ... 
    @GetMapping("/file/{id}") 
    @Timed 
    public void getFile(@PathVariable Long id, HttpServletResponse response) throws URISyntaxException, IOException { 
     FileInputStream stream = fileService.getFile(id); 
     response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); 
     response.setHeader("Content-disposition", "attachment; filename=test.docx"); 
     IOUtils.copy(stream,response.getOutputStream()); 
     stream.close(); 
    } 
} 

Le contenu du contrôleur:

(function() { 
    'use strict'; 

    angular 
     .module('myApp') 
     .controller('MyController', MyController); 

    MyController.$inject = ['$timeout', '$scope', '$stateParams', '$uibModalInstance']; 

    function MyController ($timeout, $scope, $stateParams, $uibModalInstance) { 
     var vm = this; 
     vm.clear = clear; 
     vm.dwl = dwl; 

     function dwl (id) { 
      window.location = "http://localhost:8080/file/"+id; 
      vm.clear(); 
     } 

     function clear() { 
      $uibModalInstance.dismiss('cancel'); 
     } 
    } 
})();