Java 如何使用servlet从服务器读取pdf文件?
在这里,我尝试使用Javaservlet从服务器读取pdf文件。下面的代码我得到的文件路径,如果文件存在,然后尝试读取文件,但文件没有打开Java 如何使用servlet从服务器读取pdf文件?,java,jsp,pdf,servlets,Java,Jsp,Pdf,Servlets,在这里,我尝试使用Javaservlet从服务器读取pdf文件。下面的代码我得到的文件路径,如果文件存在,然后尝试读取文件,但文件没有打开 String filePath = dirName; String fileName = si + "_" + dnldFilename; FileInputStream fileToDownload = new FileInputStream(filePath.concat(fileName);
String filePath = dirName;
String fileName = si + "_" + dnldFilename;
FileInputStream fileToDownload = new FileInputStream(filePath.concat(fileName);
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setContentLength(fileToDownload.available());
int c;
while ((c = fileToDownload.read()) != -1) {
response.getOutputStream().write(c);
}
response.getOutputStream().flush();
response.getOutputStream().close();
fileToDownload.close();
错误在这里:
response.setContentLength(fileToDownload.available());
这个人不会做你认为的事。它不会返回响应头所表示的内容总长度。它返回在不阻塞所有其他线程的情况下可读取的字节数(即当前已放入硬件缓冲区的字节)。如果这低于实际文件大小,那么客户端可能会停止读取响应的其余部分。换句话说,客户机只得到PDF文件的一部分,因为您告诉客户所需的部分正好是给定的长度
您需要构造一个法线并通过获取文件大小
这里是一个完整的重写,进一步减少了遗留Java IO样板。这假设您至少使用了Java 7(因为Java 6从2013年起就是EOL,所以没人会想到您已经使用Java 6两年了):
就这样。请注意,上述代码片段也可以通过这种方式用于所有其他类型的文件。您可以通过web.xml
中的
条目管理未知的内容类型
还请注意,我正在将内容长度转换为字符串,因为setContentLength()
只接受int
,而文件#length()
返回long
,如果文件大于2GB,则会失败。如果您已经使用Servlet3.1(Tomcat8等),请使用新方法
另见:
File file = new File(filePath, fileName);
response.setHeader("Content-Type", getServletContext().getMimeType(file.getName()));
response.setHeader("Content-Length", String.valueOf(file.length()));
response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
Files.copy(file.toPath(), response.getOutputStream());
response.setContentLengthLong(file.length());