从服务器使用window.open打开PDF文件

时间:2013-08-10 11:16:47

标签: java jsp tomcat struts2 liferay

我有一个生成PDF文件并将其存储在/temp文件夹中的方法。我正在使用tomcat。我想打开PDF文件。我在JavaScript中使用window.open方法尝试过这个。但是在单击超链接时,它表示找不到所请求的资源。

我使用以下行将PDF文件存储在/temp文件夹中(当然文件生成并保存在该位置):

inputMap.put(TableProperties.PDF_PATH, "/temp/report.pdf");

现在在JSP中我尝试以下

<tr>
  <td>
    <a href="" onclick="javascipt:window.open('/temp
/report.pdf');" class="popup">Click to open.</a>
  </td>
</tr>

但它显示以下错误:

The requested resource was not found. 

http://localhost:8080/temp/report.pdf

----------- -------------- EDITED

尝试以下方法:

在JSP页面中,打开文件的下载链接

<tr>
  <td>
    <a href='<s:url action='gotoDownloadPdf'> </s:url>'>
      download
    </a>
  </td>
</tr>
struts.xml中的

<action name="gotoDownloadPdf" class="com.stp.portal.view.SearchServicePortlet" method="gotoDownloadPdf">
            <result name="success">/WEB-INF/view/pdfDownload.jsp</result>   
        </action>

一个JSP页面,其中包含用于下载PDF文件的JavaScript:

<%@ page import="java.util.*,java.io.*"%>
<%@ page language="java"%>
<!--Assumes that file name is in the request objects query Parameter -->
<%
    //response.setHeader ("Cache-Control","no-cache");
    //response.setHeader ("Pragma","no-cache");
    //response.setHeader ("Expires",0);
    //read the file name.
    try
    {
        String fpath="/temp/"; 
        String fileName="report.pdf"; 
        fpath = fpath + fileName;  
        String fileType="pdf";

        File f = new File (fpath);


        //set the header and also the Name by which user will be prompted to save
        response.setHeader ("Content-Disposition", "attachment;filename=\""+fileName+"\"");
        //get the file name
        String name = f.getName().substring(f.getName().lastIndexOf("/") + 1,f.getName().length());

        //OPen an input stream to the file and post the file contents thru the 
        //servlet output stream to the client m/c
        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);
            }
            //System.out.println("" +bit);


            }
            catch (Exception ioe) 
            {
                //ioe.printStackTrace(System.out);
            }
                    System.out.println( "\n" + i + " bytes sent.");
                    System.out.println( "\n" + f.length() + " bytes sent.");
            servletOutputStream.flush();
            //outs.close();
            inputStream.close();    
    }
    catch(Exception e)
    {

    }

%>

现在,当我点击下载链接时,没有任何反应,它会重定向到JSP页面,但不会出现下载的弹出窗口。

3 个答案:

答案 0 :(得分:1)

想想你在做什么。您是否真的认为在浏览器地址栏中输入http://www.google.com/tmp/secretReport.pdf可以访问Google服务器文件系统上/tmp目录中的某个秘密报告?

您不能像这样通过HTTP访问服务器的文件系统。你需要的是一个由浏览器调用的servlet,它读取PDF文件并在HTTP响应中发送它。

答案 1 :(得分:0)

你错了:

  1. 该文件是在服务器上创建的,因此无法在客户端上打开 使用JavaScript
  2. 首先需要下载文件,你需要提供映射到动作的url,可能还有参数你要下载的文件。如果在另一个操作中创建文件,则可以在JSP中显示要下载的文件的名称。只需使用action属性作为文件名。
  3. 不建议使用scriptlet中的Java代码,请使用此代码实现用于返回stream结果的操作。
  4. 为了你的幸福而有example to download a file with struts2。您所需要的只是将它应用于您的场景。

答案 2 :(得分:0)

我看到其他人已经回答了你的结果,但我发现你很难理解他们的答案。那么,我有一些更简单的开始。

只需在您的网页(站点根目录)目录中创建一个名为/ temp的文件夹,然后输入PDF(report.pdf),然后该链接即可使用。

现在您只需使用简单的文件IO将报告放在该文件中即可。

例如如果你编写代码来写一个名为xyz.pdf的PDF文件在temp目录中(已经在你的web-root中可用),那么访问url将是/temp/xyz.pdf

希望这个人有所帮助。

这是一个小的快速example on how to download file using struts2