以Blob格式或二进制格式下载存储在MySQL数据库中的PDF文件时获取Null异常

时间:2016-02-03 06:10:57

标签: java mysql jsp tomcat servlets

您好我试图以Blob格式或二进制格式下载存储在MySQL数据库中的PDF文件,并且我在do.GET上获得Null异常 这是我的代码 和 Stack Trace`

enter code here


import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/downloadFileServlet")
public class DBFileDownloadServlet extends HttpServlet {

    // size of byte buffer to send file
    private static final int BUFFER_SIZE = 4096;    

// database connection settings
private String dbURL = "jdbc:mysql://localhost:3306/test";
private String dbUser = "root";
private String dbPass = "secret";

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // get upload id from URL's parameters
    int uploadId = Integer.parseInt(request.getParameter("id"));

    Connection conn = null; // connection to the database

    try {
        // connects to the database
        DriverManager.registerDriver(new com.mysql.jdbc.Driver());
        conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","ROOT");

        // queries the database
        String sql = "SELECT * FROM files_upload WHERE upload_id = ?";
        PreparedStatement statement = conn.prepareStatement(sql);
        statement.setInt(1, uploadId);

        ResultSet result = statement.executeQuery();
        if (result.next()) {
            // gets file name and file blob data
            String fileName = result.getString("file_name");
            Blob blob = result.getBlob("file_data");
            InputStream inputStream = blob.getBinaryStream();
            int fileLength = inputStream.available();

            System.out.println("fileLength = " + fileLength);

            ServletContext context = getServletContext();

            // sets MIME type for the file download
            String mimeType = context.getMimeType(fileName);
            if (mimeType == null) {         
                mimeType = "application/octet-stream";
            }               

            // set content properties and header attributes for the response
            response.setContentType(mimeType);
            response.setContentLength(fileLength);
            String headerKey = "Content-Disposition";
            String headerValue = String.format("attachment; filename=\"%s\"", fileName);
            response.setHeader(headerKey, headerValue);

            // writes the file to the client
            OutputStream outStream = response.getOutputStream();

            byte[] buffer = new byte[BUFFER_SIZE];
            int bytesRead = -1;

            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outStream.write(buffer, 0, bytesRead);
            }

            inputStream.close();
            outStream.close();              
        } else {
            // no file found
            response.getWriter().print("File not found for the id: " + uploadId);   
        }
    } catch (SQLException ex) {
        ex.printStackTrace();
        response.getWriter().print("SQL Error: " + ex.getMessage());
    } catch (IOException ex) {
        ex.printStackTrace();
        response.getWriter().print("IO Error: " + ex.getMessage());
    } finally {
        if (conn != null) {
            // closes the database connection
            try {
                conn.close();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }           
    }
}

}

     SEVERE: Servlet.service() for servlet [Download] in context with path           [/Download111] threw exception
     java.lang.NumberFormatException: null
     at java.lang.Integer.parseInt(Unknown Source)
     at java.lang.Integer.parseInt(Unknown Source)
     at Download.doGet(Download.java:42)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
     at    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
     at   org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
      at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
      at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
      at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
      at java.lang.Thread.run(Unknown Source)

请帮助..

如果我将int解析更改为字符串我得到httpmaxheadersize的http 500错误我无法检索存储在MySQL dB中的PDF

1 个答案:

答案 0 :(得分:0)

在您的jsp文件中,没有以“id”命名的元素,因此请更改Integer.parseInt(request.getParameter("id")); to Integer.parseInt(request.getParameter("BookId"));