gpt4 book ai didi

java - 如何使用servlet从服务器读取pdf文件?

转载 作者:行者123 更新时间:2023-11-30 03:21:29 25 4
gpt4 key购买 nike

这里我尝试使用java servlet从服务器读取pdf文件。下面的代码我获取文件路径(如果文件存在),然后尝试读取文件,但是文件未打开?

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

InputStream#available() 不做你( and the average Java starter )所想的。它不返回响应 header 所代表的总内容长度。它返回可用于读取的字节数,而不阻塞所有其他线程(即当前已放入硬件缓冲区中的字节)。如果这低于实际文件大小,则客户端可能会停止读取响应的其余部分。换句话说,客户只得到了 PDF 文件的一部分,因为你告诉客户所需的部分正是给定的长度。

您需要构造一个正常的 java.io.File 并通过 File#length() 获取文件大小.

这是一个完整的重写,进一步减少了遗留的 Java IO 样板。这假设您至少使用 Java 7(因为 Java 6 自 2013 年起就已停产,没有人会期望您在 2 年后仍然使用 Java 6):

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

就是这样。请注意,上面的代码片段也可以通过这种方式重用于所有其他类型的文件。您可以通过 <mime-mapping> 管理未知内容类型web.xml 中的条目.

另请注意,我将内容长度转换为字符串,如 setContentLength()只需要 intFile#length()返回long ,如果文件大于 2GB,则会失败。如果您已经使用 Servlet 3.1(Tomcat 8 等),请使用新的 setContentLengthLong() 方法。

response.setContentLengthLong(file.length());

另请参阅:

关于java - 如何使用servlet从服务器读取pdf文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com