1. Рамковий агностик: файл завантаження сервлетів як додаток
<!-- with JS -->
<a href="javascript:window.location='downloadServlet?param1=value1'">
download
</a>
<!-- without JS -->
<a href="downloadServlet?param1=value1" >download</a>
2. Рамка Struts2: завантаження файлу в якості вкладення
<!-- 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 як сервлет, хак для прямого потокового передачі ), вам не потрібно нічого прямо писати у відповідь; просто використовувати тип результату Stream і конфігурувати його в 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): файл відкриття сервлета (/ дії) всередині браузера
Якщо ви хочете відкрити файл всередині браузера, замість того, щоб завантажувати його, вміст диспозиції повинен бути встановлений як вбудований , але ціль не може бути поточним розташуванням вікна; ви повинні орієнтуватися на нове вікно, створене 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>