1. Independente da estrutura: Servlet baixando arquivo como anexo
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: Ação baixando arquivo como anexo
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Seria melhor usar a <s:a>
tag apontando com OGNL para um URL criado com a <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>
Nos casos acima, você precisa gravar o cabeçalho Disposição de Conteúdo na resposta , especificando que o arquivo precisa ser baixado ( attachment
) e não aberto pelo navegador ( inline
). Você também precisa especificar o Tipo de conteúdo e adicionar o nome e o comprimento do arquivo (para ajudar o navegador a desenhar uma barra de progresso realista).
Por exemplo, ao baixar um 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...
Com o Struts2 (a menos que você esteja usando a Ação como um Servlet, um hack para transmissão direta , por exemplo), você não precisa escrever nada diretamente na resposta; simplesmente usar o tipo de resultado Stream e configurá-lo em struts.xml funcionará: EXEMPLO
<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. Agnóstico da estrutura (estrutura / Struts2): arquivo de abertura do servlet (/ Ação) dentro do navegador
Se você deseja abrir o arquivo dentro do navegador, em vez de baixá-lo, a disposição do Conteúdo deve ser configurada para embutida , mas o destino não pode ser o local atual da janela; você deve direcionar uma nova janela criada por javascript, uma <iframe>
na página ou uma nova janela criada on-the-fly com o "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>