Télécharger un .docx depuis le serveur vers le client
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[].
Code:
1 2 3 4 5 6
|
WordprocessingMLPackage p = null;
...
File f = new File(filePath);
p.save(f);
byte[] stream = Files.readAllBytes(f.toPath()); |
J'ai essayé de l'envoyer vers le client dans différents formats:
- byte[]
- byte[] encoded Base64
- String
- String encoded Base64
Voici à quoi ressemble ma méthode :
Code:
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));
} |
Côté client
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é.
Code:
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);
}); |
Et mon service est déclaré comme ceci :
Code:
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);
}
}
});
}
})(); |
Quand je le télécharge, voici le message qui apparaît :
Citation:
"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é."
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...
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 :D
Merci !
infos: Eclipse, Spring, java, jhipster, angularjs.