1. Framework agnostique: fichier de téléchargement de servlet 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. Struts2 Framework: fichier de téléchargement d'actions 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 une <s:a>
balise pointant avec OGNL vers une URL créée avec une <s:url>
balise:
<!-- 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 devez écrire l'en - tête Content-Disposition dans la réponse , en spécifiant que le fichier doit être téléchargé ( attachment
) et non ouvert par le navigateur ( inline
). Vous devez spécifier le type de contenu et vous pouvez 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 en tant que servlet, un hack pour le streaming direct , par exemple), vous n'avez pas besoin d'écrire directement quoi que ce soit dans la réponse; simplement utiliser le type de résultat Stream 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. Framework agnostique (framework / Struts2): fichier d'ouverture Servlet (/ Action) dans le navigateur
Si vous souhaitez ouvrir le fichier à l'intérieur du navigateur, au lieu de le télécharger, la disposition de contenu doit être définie sur inline , mais la cible ne peut pas être l'emplacement actuel de la fenêtre; vous devez cibler une nouvelle fenêtre créée par javascript, un <iframe>
dans la page, ou une nouvelle fenêtre créée à la volée avec la cible "discutée" = "_ vide":
<!-- 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>