【问题标题】:Servlet - Force overwrite downloaded fileServlet - 强制覆盖下载的文件
【发布时间】:2012-01-22 16:41:17
【问题描述】:

如何更改此代码以强制覆盖保存在驱动器上的现有先前打开的文件?它是用于在客户端打开 pdf 文件的 servlet 的一部分。

response.reset();
response.setContentType("application/pdf");
response.setContentLength(file.length());
response.setHeader("Content-disposition", "inline; filename=\"" + file.getName() + "\"");
BufferedInputStream input = null;
BufferedOutputStream output = null;

try 
{
  input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);
  output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);

  byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
  int length;
  while ((length = input.read(buffer)) > 0) 
  {
    output.write(buffer, 0, length);
  }
} 
finally 
{
  close(output);
  close(input);
}

打开文件的每个下一个副本都有一个新索引,例如test.pdf、test(1).pdf等

【问题讨论】:

    标签: java jsf jakarta-ee servlets jsf-2


    【解决方案1】:

    无法控制它。

    这取决于客户端的操作系统文件系统实现

    【讨论】:

    • 谢谢吉加尔。这有点烦人,所以我不得不不时手动删除它:(
    • “你无法控制它。” 幸运的是。有多少开发人员认为他们有能力或有权强迫最终用户做(或不做)任何事情,这让我永远感到惊讶。它可能是你的应用程序,但你的应用程序。是我的电脑上的访客
    • 但这对我来说是一样的。拥有许多不同的文件或许多索引文件:)
    • 你说得对,安德鲁,但在这种情况下,没有什么比得上“我的电脑”了。这是一个企业员工的内部网应用程序:)
    【解决方案2】:

    最好的方法是配置客户端浏览器询问是否覆盖,例如在 Firefox 中是:

    据我所知,要求覆盖是 Opera 的默认行为。

    【讨论】:

    • 您不能强制客户端从 Servlet 执行此操作 :)
    • 谢谢奥列格。我就是这样做的,问题是,这会影响所有其他下载。所以我认为可以在 servlet 上完成 :)
    【解决方案3】:

    在写之前检查给定的文件是否存在? 如果存在,则使用文件 api file.exists(),使用文件 api file.delete() 删除给定文件并继续写入过程

    【讨论】:

    • 这些将在服务器的 JVM 上被调用。并且文件将在客户的机器上
    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 2013-05-12
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多