我想从服务器下载pdf文件。我正在使用tomcat。并在struts2中开发应用程序。
在我的jsp代码中,下载链接如下:
<td>
<a href='<s:url action='downloadPdf'> </s:url>'>
Download PDF</a>
</td>
我的struts.xml是:
<action name="downloadPdf" class="com.stp.portal.view.SearchServicePortlet" method="downloadPdf">
</action>
行动类是:
public void downloadPdf() throws Exception
{
HttpServletResponse response = null;
try
{
response.setContentType ("application/pdf");
File f = new File ("D:\\abc.pdf");
response.setHeader ("Content-Disposition", "attachment;filename=abc.pdf");
InputStream inputStream = new FileInputStream(f);
ServletOutputStream servletOutputStream = response.getOutputStream();
int bit = 256;
int i = 0;
try
{
while ((bit) >= 0)
{
bit = inputStream.read();
servletOutputStream.write(bit);
}
}
catch (Exception ioe)
{
ioe.printStackTrace(System.out);
}
servletOutputStream.flush();
inputStream.close();
}
catch(Exception e)
{
}
}
public String generateGraph() throws Exception
{
return "success";
}
}
我的问题是当我点击下载链接时,没有下载文件。 abc.pdf文件在本地磁盘D里面。不知道出了什么问题。如果有人可以帮助我,我真的很感激。
提前致谢。
答案 0 :(得分:0)
尝试将代码更改为以下内容:
response.setContentType("application/force-download");
File f = new File ("D:\\abc.pdf");
response.addHeader("Content-Disposition", "attachment; filename=\"abc.pdf\"");
InputStream inputStream = new FileInputStream(f);
BufferedOutputStream out =
new BufferedOutputStream(response.getOutputStream());
byte by[] = new byte[32768];
int index;
if (inputStream != null) {
index = inputStream.read(by, 0, 32768);
} else {
index = -1;
}
while (index != -1) {
out.write(by, 0, index);
index = inputStream.read(by, 0, 32768);
}
out.flush();
答案 1 :(得分:0)
更改此代码。请注意输入流的处理:如果发生I / O错误,它会正确关闭:
final byte[] buf = new byte[16384];
int count;
final InputStream in = new FileInputStream(...);
final OutputStream out = servlet.getOutputStream();
try {
while ((count = in.read(buf)) != -1)
out.write(buf, 0, count);
out.flush();
} catch (...) {
} finally {
in.close();
}
如果您负担得起,请使用Guava及其Closer
来处理I / O资源。
答案 2 :(得分:0)
Liferay有一个sample-struts portlet,其中包含未嵌入完整门户网站页面的下载自定义类型 - 例如内容类型可以与通常门户网站的HTML不同。在this example中它是image / jpeg。根据你的问题申请。