Bonjour à tous !
J'espère me trouver dans la bonne section après avoir pas mal hésité, si jamais ce n'est pas le cas, je m'en excuse et peut-être qu'un admin se chargera de déplacer le topic
Je développe actuellement une application Java qui utilise le framework jhipster.
J'utilise aussi docx4j pour créer le document, et je souhaite télécharger ce document depuis mon serveur vers mon client.
Quand j'essaie d'ouvrir le fichier word téléchargé, j'ai un message d'erreur en me disant qu'il est corrompu...
Côté serveur
Je génère mon fichier et le place dans un byte[].
J'ai essayé de l'envoyer vers le client dans différents formats:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 WordprocessingMLPackage p = null; ... File f = new File(filePath); p.save(f); byte[] stream = Files.readAllBytes(f.toPath());
- byte[]
- byte[] encoded Base64
- String
- String encoded Base64
Voici à quoi ressemble ma méthode :
Côté client
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 // 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)); }
Je récupère mon fichier en tant que byte[] ou String et je le mets dans un blob pour qu'il soit téléchargé.
Et mon service est déclaré comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 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); });
Quand je le télécharge, voici le message qui apparaît :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 (function() { 'use strict'; angular .module('deliverymanagerApp') .factory('BillGenerate', BillGenerate); BillGenerate.$inject = ['$resource', 'DateUtils']; function BillGenerate ($resource, DateUtils) { var resourceUrl = 'api/bill/:id/generate'; return $resource(resourceUrl, {}, { 'get': { method: 'GET', responseType:'arraybuffer' }, 'update': { method: 'PUT', transformRequest: function (data) { data.startDate = DateUtils.convertLocalDateToServer(data.startDate); data.endDate = DateUtils.convertLocalDateToServer(data.endDate); return angular.toJson(data); } } }); } })();
Mais quand je le compare avec mon original en les ouvrant avec notepad++, je vois que le contenu binaire n'est pas exactement le même, comme s'il y avait des problèmes d'encodage/décodage..."Désolé... Nous ne pouvons pas ouvrir *fichier*.docx, car nous avons découvert un problème avec son contenu. Nous ne pouvons pas ouvrir le fichier, car celui-ci est endommagé."
Leur taille est différente aussi, le fichier original fait 13Ko et le téléchargé 18Ko.
Ca fait déjà plusieurs jours que je suis sur cette tâche mais sans trouver de solution. Donc toute l'aide que vous êtes susceptibles de m'apporter est la bienvenue
Merci !
infos: Eclipse, Spring, java, jhipster, angularjs.
Partager