Bonjour tout le monde,
J'ai une API Java qui me renvoie un StreamResponse quand je lui demande de télécharger une archive. J'arrive bien à récupérer l'objet JSON ou XHR qui revient avec ma requête AJAX de récupération de cette archive, mais je n'arrive pas à en récupérer le flux pour lancer le téléchargement.
Est-ce que quelqu'un saurait m'aider sur le sujet et m'indiquer comment lancer ce téléchargement ?
L'idée sous-jacente liée à l'utilisation d'AJAX est que lorsque je demande la récupération de l'archive, je lui passe un ensemble de paramètres qui déterminent comment est construite l'archive. Cette construction prend évidemment du temps et j'affiche en JS sur l'action AJAX un sablier et un message invitant à patienter. Quand je reçois mon retour AJAX, avec donc mon StreamResponse, j'aimerais lancer son téléchargement. Je n'ai évidement pas accès, avec cette API (privée) à l'adresse du fichier qui a été construit et qui va être téléchargé.
Code JavaScript dans lequel je souhaiterais lancer le téléchargement du Stream --ligne en gras
Page TML d'où proviennent les appels JavaScript/AJAX/**
* Script prototype pour masquer et afficher la sélection des logs sur un appel AJAX de récupération des logs.
*/
var ajaxLogsRetrieverDisplay = {
onCreate : function() {
Element.show('waitWhileRetrieving');
Element.fade('logZone');
},
onComplete : function(xhr, json) {
Element.show('logZone');
Element.fade('waitWhileRetrieving');
$('logsArchive').innerHTML = xhr.responseStream;
}
};
/**
* Enregistrement du script permettant "d'intercepter" les appels/retours AJAX.
*/
AjaxLogsRetrieverTracker = {
init : function() {
Ajax.Responders.register(ajaxLogsRetrieverDisplay);
}
}
Code Java appelé --Il va de soit que le Thread.sleep n'est là que pour les tests....<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd" xmlns:p="tapestry:parameter">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
<t:content>
<body t:type="layout" title="${message:page-titre}" menuCourant="41">
<t:zone id="zoneLogSelection" t:id="zoneLogSelection">
<div class="panel" t:type="zone" t:id="logZone" id="logZone"><t:form t:id="logsForm" t:zone="zoneLogSelection">
<h1>${message:panel-log-title}</h1>
<t:loop source="logSelectors" value="rootLog" formstate="ITERATION" encoder="encoder">
<fieldset style="border-color: #e0e0e0;"><span id="${rootLog.indicator}"><legend><input t:type="checkbox" value="rootChecked"
onclick="refreshChildrenCheckBox('${rootLog.indicator}')" /> ${rootLog.label} </legend></span> <t:loop source="rootLog.childLogSelector" value="nodeLog"
formstate="ITERATION" encoder="encoder">
<div class="champs"><label>${nodeLog.label}</label> <input t:type="checkbox" value="nodeChecked" style="width: auto"
onclick="refreshParentCheckBox('${rootLog.indicator}')" /></div>
</t:loop></fieldset>
</t:loop>
<div style="margin-left: auto; margin-right: auto; text-align: center;"><t:linkSubmit style="text-decoration: none" id="retrieveLogs"
t:id="retrieveLogs">
<img src="${asset:charte:images}/div/arrow.gif" border="0" /> ${message:telecharger-label}</t:linkSubmit></div>
</t:form></div>
</t:zone>
<t:zone id="zoneWaitWhileRetrieving" t:id="zoneWaitWhileRetrieving">
<div id="waitWhileRetrieving" style="display: none">
<h2>${message:recuperation-info}</h2><img id="imgStatusDomain" src="${asset:charte:images}/status/check.gif"
alt="${message:recuperation-info}" title="${message:recuperation-info}" />
<br />
<i>${message:patience-info}</i></div>
</t:zone>
<div id="logsArchive"> </div>
</body>
</t:content>
</html>
Par avance, Merci pour votre aide,
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 /** * Méthode exécutée après le submit du formulaire. * * @return le flux de l'archive des logs. */ @Log StreamResponse onSuccess() { if (request.isXHR()) { LOGGER.info("Requete AJAX"); } else { LOGGER.info("Requete non AJAX"); } return new StreamResponse() { @Override public String getContentType() { return TAR_GZ_CONTENT_TYPE; } @Override public InputStream getStream() throws IOException { // final BeanDomaine beanDomaine = sessionManager.getDomaineProduit(); /***************************/ /** Paramètres du domaine **/ /***************************/ // final String envPrdt = beanDomaine.getEnvironnementProduit(); // final String rds = beanDomaine.getRds(); // final String dpt = beanDomaine.getDepartement(); // final String envData = beanDomaine.getEnvironnementDonnees(); try { // return archiveRetriever.getLog(envPrdt, rds, dpt, envData, logSelectors); final ByteArrayInputStream in = new ByteArrayInputStream(new byte[] {'<', 'h', 't', 'm', 'l', '>', '<', 't', 'i', 't', 'l', 'e', '>', 't', 'o', 't', 'o', '<', '/', 't', 'i', 't', 'l', 'e', '>', '<', 'b', 'o', 'd', 'y', '>', 't', 'o', 't', 'o', '<', '/', 'b', 'o', 'd', 'y', '>', '<', '/', 'h', 't', 'm', 'l', '>'}); Thread.sleep(10000); return in; // } catch (final ArchiveRetrieverException e) { // LOGGER.error("Erreur lors de l'obtention de l'archive de logs.", e); } catch (final InterruptedException e) { LOGGER.error("Impossible de dormir 10s...", e); } return null; } @Override public void prepareResponse(final Response response) { LOGGER.info("Fichier renvoye : " + ConstantsUtils.VALUE_FOR_LOGGER, FILE_NAME); response.setHeader("Content-Disposition", "attachment; filename=" + FILE_NAME); } }; }
Partager