1. Независимость от фреймворка: загрузка файла сервлетом в виде вложения
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Struts2 Framework: действие загрузки файла в виде вложения
<!-- with JS -->
<a href="javascript:window.location='downloadAction.action?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadAction.action?param1=value1" >download</a>
Было бы лучше использовать <s:a>
тег, указывающий с OGNL на URL, созданный с <s:url>
тегом:
<!-- 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>
В вышеупомянутых случаях вам нужно записать заголовок Content-Disposition в ответ , указав, что файл должен быть загружен ( attachment
) и не открыт браузером ( inline
). Вам необходимо указать тип контента , и вы можете добавить имя и длину файла (чтобы браузер мог нарисовать реалистичный индикатор выполнения).
Например, при загрузке 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...
В Struts2 (если вы не используете Action в качестве сервлета, например, хак для прямой потоковой передачи ), вам не нужно напрямую что-либо записывать в ответ; просто используя тип результата потока и его настройку в struts.xml будет работать: Пример
<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. Независимость от фреймворка (/ Struts2 framework): открытие файла сервлета (/ Action) внутри браузера
Если вы хотите открыть файл в браузере, вместо загрузки его, Content-disposition должен быть установлен в встроено , но целью не может быть текущее расположение окна; Вы должны настроить таргетинг на новое окно, созданное с помощью javascript, <iframe>
на странице или новое окно, созданное на лету с «обсужденным» 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>