Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoyer un .docx du serveur vers le client

Télécharger un document word présent sur le serveur

Anonyme
21 mars 2017 à 14:33:47

Bonjour à tous !

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[].

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 :

// send back as String encoded in Base64
public ResponseEntity<BillDTO> generateBill(@PathVariable Long id) throws URISyntaxException, IOException {
        log.debug("Print bill : {}", id);
		Bill bill = billRepository.findOne(id);
        byte[] stream = billingManagerService.printBill(bill);
        BillDTO result = billMapper.billToBillDTO(bill);
        byte[] encoded = Base64.encodeBase64(stream);
		String encodedString = new String(encoded, "UTF-8");
        final HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"));
        headers.add("content-disposition", "attachment; filename=test.docx");
        result.setCompanyName(encodedString);
        result.setFile(encoded);
        logDB.debug(Action.OTHER, Entity.BILL, result.toLog());
        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é.

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 :

(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 :

"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.

-
Edité par Anonyme 22 mars 2017 à 11:09:02

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2020 à 11:53:25

Bonjour,

Je ferme ce sujet pour le laisser redescendre dans le forum ...

En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL