Java 尝试从数据库下载PDF文件时fileLength=0

Java 尝试从数据库下载PDF文件时fileLength=0,java,oracle,file,servlets,Java,Oracle,File,Servlets,fileLength=0 文件读取成功 尝试从数据库下载pdf文件时,将文件长度设置为null。 实际上必须得到一些PDF文件,其中包含一些存储在本地数据库中的内容 您能帮我解决这个问题吗?现在该怎么做才能解决这个问题?文件只能通过客户端程序上传 public class FileDownload extends HttpServlet { private static final int BUFFER_SIZE = 40960; pr

fileLength=0 文件读取成功
尝试从数据库下载pdf文件时,将文件长度设置为null。 实际上必须得到一些PDF文件,其中包含一些存储在本地数据库中的内容 您能帮我解决这个问题吗?现在该怎么做才能解决这个问题?文件只能通过客户端程序上传

        public class FileDownload extends HttpServlet {

          private static final int  BUFFER_SIZE = 40960;


        protected void doGet(--){

            String bookId = request.getParameter("bookId");


            Connection conn=null;
            try {

                 Class.forName("--");

                Connection con=DriverManager.getConnection("--");

                String sql="SELECT * from book where bookId=?";
                PreparedStatement statement = con.prepareStatement(sql);
                statement.setString(1, bookId);

                ResultSet result = statement.executeQuery();

                        if(result.next()) {

                    String bookTitle = result.getString("bookTitle");
                    Blob blob = result.getBlob("bookContent");


                    InputStream inputStream = blob.getBinaryStream();
                    int fileLength = inputStream.available();
                    System.out.println("fileLength = " +fileLength);

                    ServletContext context = getServletContext();
                    String mimeType = context.getMimeType(bookTitle);
                    if (mimeType == null) {        
                        mimeType = "application/pdf";
                                       }              

                    System.out.println("File Reading Success");
                    response.setContentType(mimeType);

                    response.setContentLength(fileLength);
                    String headerKey = "Content-Disposition";
                    String headerValue = String.format("attachment; fileName=\"%s\"", bookTitle +".pdf");

                    response.setHeader(headerKey, headerValue);


                    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();             
                } 

InputStream.available()
不返回文件长度,而是返回可以在不阻塞的情况下从流中读取的字节数。在您显式请求内容之前,数据库很可能不会发送任何Blob字节,因此返回0

因此使用

int fileLength = blob.length();

这将为您提供文件的确切长度。

如果没有实际的数据库,则无法对其进行调试。+太多的源代码。您应该提供再现您的问题的最小工作示例。谢谢您,工作正常,再次感谢您35; WERO