Java 如何使用servlet将PDF文件发送到客户端。?

Java 如何使用servlet将PDF文件发送到客户端。?,java,web-services,pdf,file-upload,Java,Web Services,Pdf,File Upload,我正在尝试使用servlet向客户端发送PDF文件的小代码。我开发了一个代码,附在下面。当我在glassfish服务器上的NetBeans中运行此代码时,会出现一个弹出的下载窗口,我单击“打开”选项,它会显示“格式有问题”,我无法看到文件中的内容。 有人能帮我解决这个逻辑错误吗 package com.transferPDF; import java.io.File; import java.io.FileInputStream; import java.io.IOExcept

我正在尝试使用servlet向客户端发送PDF文件的小代码。我开发了一个代码,附在下面。当我在glassfish服务器上的NetBeans中运行此代码时,会出现一个弹出的下载窗口,我单击“打开”选项,它会显示“格式有问题”,我无法看到文件中的内容。 有人能帮我解决这个逻辑错误吗

  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";
  }

}

使用下面的标题

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

您只需要对编写PDF的方式做一些更改

我在这里得到了返回正确渲染的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();
        }
    }

你能不能把它保存在某个地方,然后检查一下,而不是打开它?是的,我这样做了。但是同样的情况@DavidT.macknetame当您尝试打开保存的版本时会发生什么情况?在通过此代码发送之前,您已经验证了您可以打开它-它在保存时没有损坏,而不是在输出时损坏?是的。我自己创建了test.PDF,它在任何情况下都没有损坏。@DavidT.MacknetAnd/or add
ContentType=“application/PDF”
您是否用系统上的正确路径替换了PDF的路径?还有,你说它不工作是什么意思?我用那个代码下载了PDF。不工作意味着我应用了你的代码片段,但我看到了相同的输出。替换正确的路径是什么意思@AdamRice@NirmalPurohit如果您直接复制/粘贴我的代码,它将无法工作。除非你的系统上有C:\my.pdf。我知道编码标准以及如何在我的程序中使用建议的代码。我将您的文件路径替换为我的