1. Cadre agnostique : Servlet téléchargeant le fichier en pièce jointe
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Cadre Struts2 : Action de téléchargement du fichier en pièce jointe
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Il serait préférable d'utiliser <s:a>
pointant avec OGNL à un URL créé avec <s:url>
étiquette :
<!-- without JS, with Struts tags: THE RIGHT WAY -->
<s:url action="downloadAction.action" var="url">
<s:param name="param1">value1</s:param>
</s:ulr>
<s:a href="%{url}" >download</s:a>
Dans les cas ci-dessus, vous besoin de pour rédiger le Content-Disposition à l'en-tête réponse en précisant que le fichier doit être téléchargé ( attachment
) et non ouvert par le navigateur ( inline
). Vous besoin de pour spécifier le Type de contenu également, et vous voudrez peut-être ajouter le nom et la longueur du fichier (pour aider le navigateur à dessiner une barre de progression réaliste).
Par exemple, lors du téléchargement d'un ZIP :
response.setContentType("application/zip");
response.addHeader("Content-Disposition",
"attachment; filename=\"name of my file.zip\"");
response.setHeader("Content-Length", myFile.length()); // or myByte[].length...
Avec Struts2 (sauf si vous utilisez l'action comme une servlet, un hack pour le streaming direct par exemple), il n'est pas nécessaire d'écrire directement quoi que ce soit dans la réponse ; il suffit d'utiliser la fonction Type de résultat du flux et le configurer dans struts.xml fonctionnera : EXEMPLE
<result name="success" type="stream">
<param name="contentType">application/zip</param>
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="contentLength">${fileLength}</param>
</result>
3. Cadre agnostique (/ cadre Struts2) : Servlet(/Action) ouvrant le fichier à l'intérieur du navigateur
Si vous souhaitez ouvrir le fichier dans le navigateur, au lieu de le télécharger, le bouton Contenu-disposition doit être réglé sur en ligne mais la cible ne peut pas être l'emplacement de la fenêtre actuelle ; vous devez cibler une nouvelle fenêtre créée par javascript, une fenêtre de type <iframe>
dans la page, ou une nouvelle fenêtre créée à la volée avec la mention "discuté" target="_blank" :
<!-- From a parent page into an IFrame without javascript -->
<a href="downloadServlet?param1=value1" target="iFrameName">
download
</a>
<!-- In a new window without javascript -->
<a href="downloadServlet?param1=value1" target="_blank">
download
</a>
<!-- In a new window with javascript -->
<a href="javascript:window.open('downloadServlet?param1=value1');" >
download
</a>