Java 尝试从数据库下载PDF文件时fileLength=0
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
尝试从数据库下载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