Bonjour,

J'utilise Struts 1 et par l'intermédiaire d'un formulaire je suis censé récupérer un fichier zip que je peux télécharger suite à la validation du formulaire. Pour mes traitements j'utilise une classe héritant de la classe Action.

Lorsque je télécharge mon fichier zip et que j'essaie de l'ouvrir on m'indique que le fichier est corrompu. J'utilise le HttpServletResponse pour renvoyer le fichier zip. Il paraît que cette méthode altère le fichier. Existe t'il une autre méthode pour envoyer le fichier à l'utilisateur sans passer par une sauvegarde puis un lien de téléchargement

Pour les curieux voici le code :

struts-config.xml
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
 
<struts-config>
 
	<!-- Form Beans -->
	<form-beans>
		<form-bean name="RecuperationPAEForm"
			type="com.edf.itr.forms.RecuperationPAEForm">
		</form-bean>
	</form-beans>
 
	<!-- Action Mappings -->
	<action-mappings>	     
	     <action path="/RecuperationPAE" forward="/recuperationPAE.jsp" />
	     <action path="/ValidationRecuperationPAE" type="com.edf.itr.actions.ValidationRecuperationPAEAction" name="RecuperationPAEForm" scope="request" input="/recuperationPAE.jsp">
			<forward name="success" path="/recuperationPAE.jsp">
</forward>
		</action>
</action-mappings>
</struts-config>
recuperationPae.jsp
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
 
<body>
		<h2>Récupération des PAE au format XML</h2>
		<html:form action="ValidationRecuperationPAE">
			<div id="recuperationPAEChamps">
				<label for="">Date de d&eacute;but (jj/mm/aaaa)</label><br />
				<html:text property="strDateDebut" maxlength="10" styleId="datepickerDebut" /><br /><br />
				<label for="">Date de fin (jj/mm/aaaa)</label><br />
				<html:text property="strDateFin" maxlength="10" styleId="datepickerFin" />
			</div>
			<div id="recuperationPAEErrors">
				<span style="color: red"><html:errors id="errorDate" /></span>
			</div>
			<div id="recuperationPAEValidation">
				<html:submit>Valider</html:submit>
			</div>
		</html:form>
		<br />
		<html:messages id="idMessage" message="true">
			<bean:write name="idMessage" filter="false" />
		</html:messages>
		<br />
		<br />
		<html:link action="Accueil">Retour au menu</html:link>
	</body>

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
 
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
			HttpServletResponse response) {
		String strForward = "success";
		RecuperationPAEForm vForm = (RecuperationPAEForm) form;
		try {
			if (vForm.getDateDebut() != null || vForm.getDateFin() != null) {
				if (vForm.getDateDebut().compareTo(vForm.getDateFin()) == -1) {
					UploadService vUploadService = new UploadService();
					...
					vUploadService.xmlToZip(vForm.getDateDebut(), vForm.getDateFin(), response);
					ActionMessages messages = new ActionMessages();
					ActionMessage message = new ActionMessage("recuperationPAE.success", vForm.getDateDebut(), vForm.getDateFin());
					messages.add("ok", message);
					saveMessages(request, messages);
				} else {
					throw new Exception("...");
				}
			} else {
				throw new Exception("...");
			}
		} catch (Exception e) {...}
		return mapping.findForward(strForward);
	}
la méthode xmlToZip
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
58
59
60
61
62
 
public void xmlToZip(Date pDebut, Date pFin, HttpServletResponse pResponse) throws Exception {
		/** Nom du répertoire */
		String vRepTmpPaexml = itrConfiguration.getPropertyValue(ConstantesProperties.REPERTOIRE_TEMPORAIRE_PAEXML);
		/** Nom du fichier zip */
		String vFileName = "PAExml_" + ItrDate.formatDateJour(pDebut,"dd-MM-yyyy HH-mm")
				+ "_au_" + ItrDate.formatDateJour(pFin,"dd-MM-yyyy HH-mm") + ".zip";
		/** Ajout du fichier dans la réponse */
		pResponse.setContentType("application/octet-stream");
		pResponse.setHeader("Content-Disposition", "attachment;filename=\"" + vFileName + "\"");
 
		byte[] vBuffer = new byte[1024];
    	try{
    		ServletOutputStream vOut = pResponse.getOutputStream();
    		ByteArrayOutputStream vBaos = new ByteArrayOutputStream();
    		File vFile = new File(vRepTmpPaexml + vFileName.replace(':', '-'));
    		vFile.createNewFile();
    		//FileOutputStream vFos = new FileOutputStream(vFile);
    		ZipOutputStream vZos = new ZipOutputStream(vBaos);
 
    		/** Listing des fichiers concernés */
    		String vFiltre = "PAE_[a-zA-Z_\\-0-9]*\\.xml";
    		Pattern vPattern = Pattern.compile(vFiltre);
    		List<String> vFichiersPae = new ArrayList<String>(); 
    		String [] vFichiers = new File(vRepTmpPaexml).list(); 
    		for (int i=0; i < vFichiers.length;i++) 
    		{ 
    			Matcher vMatch = vPattern.matcher(vFichiers[i]); 
    			if ( vMatch.matches()) 
    			{ 
    				vFichiersPae.add(vFichiers[i]); 
    			} 
    		}
 
    		/** Elaboration du zip */
    		for(String vFichierPae : vFichiersPae) {
    			FileInputStream vIn = new FileInputStream(vRepTmpPaexml + "/" + vFichierPae);
    			BufferedInputStream vBis = new BufferedInputStream(vIn);
    			ZipEntry vZe= new ZipEntry(vFichierPae);
    			vZos.putNextEntry(vZe);
 
    			int vLen;
    			while ((vLen = vBis.read(vBuffer)) != -1) {
    				vZos.write(vBuffer, 0, vLen);
    			}
    			vZos.closeEntry();
    			vBis.close();
    			vIn.close();
    		}
    		vZos.flush();
    		vBaos.flush();
            vZos.close();
            //vFos.close();
            vBaos.close();
 
            vOut.write(vBaos.toByteArray());
            vOut.flush();
    	}catch(IOException ex){
    		pResponse.setCharacterEncoding("");
    		throw new Exception(ex.getMessage());
    	}
	}
Merci d'avance pour votre aide