1. Agnostyk ramowy: pobieranie pliku serwletu jako załącznika
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: Akcja pobiera plik jako załącznik
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Lepiej byłoby użyć <s:a>
tagu wskazującego OGNL na adres URL utworzony za pomocą <s:url>
tagu:
<!-- 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>
W powyższych przypadkach musisz napisać nagłówek Content-Disposition w odpowiedzi , określając, że plik musi zostać pobrany ( attachment
), a nie otwarty przez przeglądarkę ( inline
). Ci potrzebne do określenia typu zawartości też, a może chcesz dodać nazwę pliku i długość (w pomocy przeglądarki rysunek realistyczny progressbar).
Na przykład podczas pobierania pliku 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...
Dzięki Struts2 (chyba że używasz akcji jako serwletu, na przykład włamania do bezpośredniego przesyłania strumieniowego ), nie musisz pisać niczego bezpośrednio w odpowiedzi; wystarczy użyć typu wyniku Stream i skonfigurowanie go w struts.xml będzie działać: PRZYKŁAD
<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 agnostic (framework / Struts2): otwieranie pliku serwletu (/ Action) w przeglądarce
Jeśli chcesz otworzyć plik w przeglądarce, zamiast go pobierać, ustawianie zawartości musi być ustawione na wartość wbudowaną , ale celem nie może być bieżąca lokalizacja okna; musisz kierować reklamy do nowego okna utworzonego przez javascript, <iframe>
na stronie lub nowego okna utworzonego w locie za pomocą „przedyskutowanego” celu = „_ puste”:
<!-- 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>