1. Agnostico del framework: file di download servlet come allegato
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: azione che scarica il file come allegato
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Sarebbe meglio usare il <s:a>
tag che punta con OGNL a un URL creato con il <s:url>
tag:
<!-- 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>
Nei casi precedenti, è necessario scrivere l' intestazione Content-Disposition nella risposta , specificando che il file deve essere scaricato ( attachment
) e non aperto dal browser ( inline
). È necessario specificare il tipo di contenuto troppo, e si consiglia di aggiungere il nome del file e la lunghezza (per aiuto il browser disegnando un ProgressBar realistico).
Ad esempio, quando si scarica 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...
Con Struts2 (a meno che tu non stia usando Action come Servlet, ad esempio un hack per lo streaming diretto ), non è necessario scrivere direttamente nulla nella risposta; semplicemente usando il tipo di risultato Stream e configurandolo in struts.xml funzionerà: ESEMPIO
<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 agnostico (/ Struts2 framework): file di apertura servlet (/ azione) all'interno del browser
Se si desidera aprire il file all'interno del browser, anziché scaricarlo, la disposizione del contenuto deve essere impostata su in linea , ma la destinazione non può essere la posizione corrente della finestra; devi scegliere come target una nuova finestra creata da JavaScript, una <iframe>
nella pagina o una nuova finestra creata al volo con il "discusso" target = "_ vuoto":
<!-- 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>