文件未从服务器下载

时间:2013-07-18 06:49:16

标签: java struts2

我想从服务器下载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里面。不知道出了什么问题。如果有人可以帮助我,我真的很感激。

提前致谢。

3 个答案:

答案 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。根据你的问题申请。