1. Marco independiente: archivo de descarga de servlet como archivo adjunto
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: Acción descargando archivo como archivo adjunto
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Sería mejor usar la <s:a>
etiqueta apuntando con OGNL a una URL creada con la <s:url>
etiqueta:
<!-- 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>
En los casos anteriores, debe escribir el encabezado Content-Disposition en la respuesta , especificando que el archivo debe ser descargado ( attachment
) y no abierto por el navegador ( inline
). También debe especificar el Tipo de contenido , y es posible que desee agregar el nombre y la longitud del archivo (para ayudar al navegador a dibujar una barra de progreso realista).
Por ejemplo, al descargar 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 menos que esté utilizando la Acción como un Servlet, un truco para la transmisión directa , por ejemplo), no necesita escribir directamente nada en la respuesta; simplemente usando el tipo de resultado Stream y configurándolo en struts.xml funcionará: EJEMPLO
<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 agnóstico (/ Struts2 framework): Servlet (/ Action) abriendo el archivo dentro del navegador
Si desea abrir el archivo dentro del navegador, en lugar de descargarlo, la disposición de contenido debe establecerse en línea , pero el destino no puede ser la ubicación actual de la ventana; debe orientar una nueva ventana creada por javascript, una <iframe>
en la página o una nueva ventana creada sobre la marcha con el "discutido" 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>