2016-04-08 122 views
0

我正在尝试使用servlet将PDF文件发送到客户端的小代码。我已经开发了一个代码,在下面讨论。当我在Glassfish服务器上的NetBeans中运行此代码时,出现一个弹出式下载窗口,并且我点击打开选项它说“格式有问题”,我无法看到来自文件的内容。 那么谁能帮我解决这个逻辑错误?如何使用servlet将PDF文件发送到客户端。

package com.transferPDF; 

    import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.io.PrintWriter; 
    import javax.servlet.ServletException; 
    import javax.servlet.http.HttpServlet; 
    import javax.servlet.http.HttpServletRequest; 
    import javax.servlet.http.HttpServletResponse; 

    public class PDFserver extends HttpServlet { 


protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    int BUFF_SIZE = 1024; 
    byte[] buffer = new byte[BUFF_SIZE]; 
    response.setContentType("application/pdf"); 
    response.setHeader("Content-Disposition", "attachment;filename=E:/test.pdf"); 
    File filePDF=new File("E:/test.pdf"); 
    FileInputStream fis = new FileInputStream(filePDF); 
    try (PrintWriter out = response.getWriter()) { 
     /* TODO output your page here. You may use following sample code. */ 
     response.setContentLength((int) filePDF.length()); 
     OutputStream os = response.getOutputStream(); 

     try { 
      int byteRead = 0; 
      while ((byteRead = fis.read()) != -1) { 
      os.write(buffer, 0, byteRead); 

      } 
      os.flush(); 
      } catch (Exception excp) { 
      excp.printStackTrace(); 
     } finally { 
      os.close(); 
      fis.close(); 
     } 
    } 
} 


@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    processRequest(request, response); 
} 

/** 
* Handles the HTTP <code>POST</code> method. 
* 
* @param request servlet request 
* @param response servlet response 
* @throws ServletException if a servlet-specific error occurs 
* @throws IOException if an I/O error occurs 
*/ 
@Override 
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    processRequest(request, response); 
} 


@Override 
public String getServletInfo() { 
    return "Short description"; 
    } 

} 
+0

不是打开它,你可以将它保存在某个地方并检查它吗? –

+0

是的,我这样做了。但是同样的情况@ DavidT.Macknet –

+0

当你试图打开保存的版本时,会发生同样的事情吗?而且您已经验证过,您可以在通过此代码发送之前打开它 - 它在保存时不会损坏,而不会在输出中损坏。 –

回答

0

使用下面的头

response.setHeader("Content-Disposition", "attachment; filename=\"test.pdf\""); 
+0

并且/或者添加'ContentType =“application/pdf”' –

+0

这也行不通了@DavidT.Macknet和@Pankaj –

0

你只需要做出你写出来的PDF的方式进行一些更改。

我在这里得到的代码返回一个正确的Chrome浏览器的PDF。

protected void processRequest(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException 
    { 
     int BUFF_SIZE = 1024; 
     byte[] buffer = new byte[BUFF_SIZE]; 
     response.setContentType("application/pdf"); 
     response.setHeader("Content-Type", "application/pdf"); 
     File filePDF = new File("c:\\my.pdf"); 
     FileInputStream fis = new FileInputStream(filePDF);  
     OutputStream os = response.getOutputStream(); 
     try 
     { 
      response.setContentLength((int) filePDF.length()); 
      int byteRead = 0; 
      while ((byteRead = fis.read()) != -1) 
      { 
       os.write(byteRead); 
      } 
      os.flush(); 
     } 
     catch (Exception excp) 
     { 
      excp.printStackTrace(); 
     } 
     finally 
     { 
      os.close(); 
      fis.close(); 
     } 
    } 
+0

Nop,它不工作@AdamRice –

+0

您是否已将系统路径替换为正确路径的PDF?另外,你是什么意思,它不工作?我已经使用该代码下载PDF。 –

+0

不工作意味着我已经应用了您的代码段,但是我看到了相同的输出。通过更换正确的路径,你的意思是什么? @AdamRice –