java - 通过 JSP 从数据库提供 PDF 文件

标签 java jsp

我正在为 Java 编写 .PDF 下载代码。我遇到一个问题,即我无法下载 .PDF 格式的文件。文件的大小是正确的,但是当我打开 .PDF 文件时,里面是空的。有什么解决办法吗?

<%@ page import="java.io.*,java.util.*,java.sql.*"%>
<%
    int id = 0;
    if (request.getParameter("id") != null && request.getParameter("id") != "")
    {
        id = Integer.parseInt(request.getParameter("id").toString());
    }

    String connectionURL = "jdbc:mysql://localhost:3306/MajorProjectDB";
    String url = request.getParameter("WEB_URL");
    String Content = new String("");
    Statement stmt = null;
    Connection con = null;

    try
    {
        String filename = "data" + id + ".pdf";
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        con = DriverManager.getConnection(connectionURL, "cdsadmin2", "enjoyit");
        stmt = con.createStatement();
        String qry = "select * from paper where PAPER_ID=" + id;
        ResultSet rst = stmt.executeQuery(qry);
        if (rst.next())
        {
            Content = rst.getString("Paper_Data");
        }
        out.println(Content);
        byte requestBytes[] = Content.getBytes();
        ByteArrayInputStream bis = new ByteArrayInputStream(requestBytes);
        response.reset();
        response.setContentType("application/pdf");
        response.setHeader("cache-control", "no-cache");
        response.setHeader("Content-disposition", "attachment; filename=" + filename);

        byte[] buf = new byte[1024];
        int len;
        while ((len = bis.read(buf)) > 0)
        {
            response.getOutputStream().write(buf, 0, len);
        }
        bis.close();
        response.getOutputStream().flush();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
%>

最佳答案

不要使用String处理二进制数据!

如果您这样做,您可能会严重破坏二进制数据,从而可能使其无法检索(即使可以检索,它也会变得复杂且非常脆弱)。

您应该使用ResultSet.getBinaryStream()从数据库获取 PDF 数据(假设它以适当的类型存储在列中!)。

然后只需从 InputStream 读取并以字节形式写入响应,不要对 char[]String 进行任何转换介于两者之间!

关于java - 通过 JSP 从数据库提供 PDF 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7074308/

相关文章:

java - 如何更新 map 中的值?

java - 为什么我不能只导入所有内容?

java - 从 Eclipse 中调试 gradle 测试

java - 如何打印 .jsp 文件中来自 Java 类的变量?

java - JSP 准备插入语句

java - 测试 WebSecurityConfigurerAdapter

java - 带有泛型参数的单例

java - <form> 标记未包含在 <s :iterator> in . jsp 的第一 <tr> 行中

java - 从数据库获取最新数据到jsp页面

javascript - 正则表达式仅允许整数和小数,不需要精度