【问题标题】:How to offer download of local PDF file in Java?如何在 Java 中提供本地 PDF 文件的下载?
【发布时间】:2022-03-01 20:42:43
【问题描述】:

我将 JBoss 作为应用程序服务器运行,并且在我的 HD 上的某处有一个 PDF 文件,当用户单击特定操作时会创建该文件。假设文件在这里:C:/PDF/doonot/10.07.2012/doonot.pdf。我怎样才能提供这个文件作为下载?我已经为 CSV 文件做过,但我不知道如何用 PDF 来做。

非常感谢任何帮助。

【问题讨论】:

  • 你是如何处理 CSV 文件的?
  • 您是在使用某种 Web 应用程序来提供文件以供下载,还是像 ftp 服务器一样使用 JBoss?
  • 不,文件只是存储在服务器上。

标签: java pdf download


【解决方案1】:

正如我在Is there a common way to download all types of files in jsp? 上写的那样

你可以使用这样的东西:

public HttpServletResponse getFile (HttpServletRequest request ,HttpServletResponse httpServletResponse, .......){
          HttpServletResponse response = httpServletResponse;
          InputStream in =/*HERE YOU READ YOUR FILE AS BinaryStream*/

          String filename = "";
          String agent = request.getHeader("USER-AGENT");
          if (agent != null && agent.indexOf("MSIE") != -1)
          {
            filename = URLEncoder.encode(/*THIS IS THE FILENAME SHOWN TO THE USER*/, "UTF8");
            response.setContentType("application/x-download");
            response.setHeader("Content-Disposition","attachment;filename=" + filename);
          }
          else if ( agent != null && agent.indexOf("Mozilla") != -1)
          {
            response.setCharacterEncoding("UTF-8");
            filename = MimeUtility.encodeText(/*THIS IS THE FILENAME SHOWN TO THE USER*/, "UTF8", "B");
            response.setContentType("application/force-download");
            response.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
          }


          BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
          byte by[] = new byte[32768];
          int index = in.read(by, 0, 32768);
          while (index != -1) {
              out.write(by, 0, index);
              index = in.read(by, 0, 32768);
          }
          out.flush();

          return response;
}

更新:

别忘了你可以这样使用 InputStream:

// read local file into InputStream
InputStream inputStream = new FileInputStream("c:\\SOMEFILE.xml");

或者你甚至可以像这样使用它

//read from database
Blob blob = rs.getBlob(1);
InputStream in = blob.getBinaryStream();

【讨论】:

  • 您能解释一下它是如何工作的:“在这里您将您的文件读取为 BinaryStream”吗?
  • 谢谢。但它不是 BinaryStream,是吗?
  • 它不起作用。该文件作为下载提供,但它是空的。 :(
  • 问题当然是:InputStream in = new FileInputStream(new File(filename));
  • @dooonot 你确定它没有按原样工作吗?应该没有问题
【解决方案2】:

您可以简单地编写一个读取 pdf 并将其写入响应输出流的 servlet。

此处示例:http://www.java-forums.org/blogs/servlet/668-how-write-servlet-sends-file-user-download.html

【讨论】:

  • 很好的输入,要试试这个!谢谢
  • “打开此文档时出错。文件已损坏,无法修复”...
  • 您可能会在文件的开头或结尾添加不需要的数据,或者不刷新,或者其他什么。尝试使用您的 servlet 下载一个简单的文本文件,看看发生了什么。
【解决方案3】:

是的,古斯塔夫是对的。 Java 不区分文件类型。文件就是文件,如果你是为 csv 做的,它也应该适用于 pdf。

【讨论】:

  • 不,它没有。它说文件已损坏,无法修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2013-10-27
  • 2016-09-11
相关资源
最近更新 更多