1

I have a method which generates a PDF file and stores it in /temp folder. I am using tomcat. I want to open the PDF file. I have tried this using window.open() method in the JavaScript. But on clicking the hyperlink it says the requested resource was not found.

I store the PDF file in /temp folder using following line (of course the file gets generated and saved in the location):

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

Now in a JSP I try the following:

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

but its showing the following error:

The requested resource was not found. 

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

EDIT:

Tried the following:

in the JSP page, a download link to open the file:

<tr>
  <td>
    <a href='<s:url action='gotoDownloadPdf'> </s:url>'>
      download
    </a>
  </td>
</tr>

in struts.xml:

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

a JSP page which contains the JavaScript to download the PDF file:

<%@ 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)
    {
                
    }
                        
%>

Now when I click on the download link, nothing happens, it redirects to the JSP page, but the pop up window for download does not appear.

4

3 回答 3

1

想想你在做什么。你真的认为http://www.google.com/tmp/secretReport.pdf在你的浏览器地址栏中输入可以让你访问一些留在/tmp谷歌服务器文件系统目录中的秘密报告吗?

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

于 2013-08-10T11:29:50.353 回答
0

你错了什么:

  1. 该文件是在服务器上创建的,因此无法在客户端使用 JavaScript 打开
  2. 该文件需要首先下载,您需要提供映射到操作的 url,可能带有您要下载的文件的参数。如果您在另一个操作中创建文件,您可以在 JSP 中显示要下载的文件的名称。只需使用 action 属性作为文件名。
  3. 不鼓励使用 scriptlet 中的 Java 代码,使用此代码来实现用于返回stream结果的操作。

为了您的幸福,有一个使用 struts2 下载文件的示例。您所需要做的就是将其应用到您的场景中。

于 2013-08-10T18:33:28.260 回答
0

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

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

现在您所要做的就是使用简单的文件 IO 将您的报告放入该文件中。

例如,如果您编写代码来编写xyz.pdf temp目录中命名的 PDF 文件(已经在您的网络根目录中可用),那么访问 url 将是/temp/xyz.pdf.

这是一个关于如何使用 struts2 下载文件的小示例。

于 2013-08-11T02:15:10.923 回答