Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用servlet从服务器读取pdf文件?_Java_Jsp_Pdf_Servlets - Fatal编程技术网

Java 如何使用servlet从服务器读取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);

在这里,我尝试使用Javaservlet从服务器读取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());
这个人不会做你认为的事。它不会返回响应头所表示的内容总长度。它返回在不阻塞所有其他线程的情况下可读取的字节数(即当前已放入硬件缓冲区的字节)。如果这低于实际文件大小,那么客户端可能会停止读取响应的其余部分。换句话说,客户机只得到PDF文件的一部分,因为您告诉客户所需的部分正好是给定的长度

您需要构造一个法线并通过获取文件大小

这里是一个完整的重写,进一步减少了遗留Java IO样板。这假设您至少使用了Java 7(因为Java 6从2013年起就是EOL,所以没人会想到您已经使用Java 6两年了):

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

还请注意,我正在将内容长度转换为字符串,因为
setContentLength()
只接受
int
,而
文件#length()
返回
long
,如果文件大于2GB,则会失败。如果您已经使用Servlet3.1(Tomcat8等),请使用新方法

另见:
    • 错误在这里:

      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等),请使用新方法

      另见:

      您是否遇到异常情况?如果是这样的话,那又怎样?您没有将文件名追加到文件路径,至少在上面的代码中是这样。上面的代码甚至不会编译。发布真实代码,并准确地说出问题所在。发布您获得的完整异常堆栈跟踪。告诉你预期会发生什么,以及会发生什么。你是否遇到异常情况?如果是这样的话,那又怎样?您没有将文件名追加到文件路径,至少在上面的代码中是这样。上面的代码甚至不会编译。发布真实代码,并准确地说出问题所在。发布您获得的完整异常堆栈跟踪。告诉别人你期望发生什么,以及会发生什么。
      response.setContentLengthLong(file.length());