0

我想从服务器下载一个 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盘里面。不知道哪里出了问题。如果有人可以帮助我,我将不胜感激。

提前致谢。

4

3 回答 3

0

Liferay有一个示例-struts portlet,它包含一个下载的自定义类型,它没有嵌入到完整的门户页面中——例如,内容类型可以不同于通常的门户的 HTML。在此示例中,它是图像/jpeg。根据你的问题应用这个。

于 2013-07-19T09:58:42.513 回答
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();
于 2013-07-18T07:02:49.813 回答
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 资源。

于 2013-07-18T07:07:29.223 回答