java - 文件交给客户后如何删除

标签 java file jsf xpages ssjs

我有一个按钮可以为客户端生成 docx 文件。我遇到的问题是生成的文件交给客户端后无法删除。服务器端技术是 JSF (XPages)。该按钮调用以下代码:

var v = new ru.generate.doc.generateDoc();
v.generateReport2();

generateReport2() 方法调用了 2 个重要的方法 generateFromTemplateAndReturnPath(String template):

private String generateFromTemplateAndReturnPath(String pathToTemplate) 
{
          XWPFDocument document = new XWPFDocument(OPCPackage.open(pathToTemplate));
          String pathToFinalResult = FilenameUtils.getFullPath(pathToTemplate) + "reportTest.docx";
          FileOutputStream fous = new FileOutputStream(pathToFinalResult);
          document.write(fous);
          fous.close();
          return pathToFinalResult;
}

和将报告提供给客户端的 giveDocumentForClient(String pathToCompleteFile) 方法:

private void giveDocumentForClient(String pathToCompleteFile) throws InvalidFormatException, IOException 
{
      String fn = new File(pathToCompleteFile).getName();
      XspHttpServletResponse response = (XspHttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
      response.setContentType(URLConnection.guessContentTypeFromName(fn));
      response.setHeader("Content-disposition", "attachment; filename=" + fn);
      OutputStream output = response.getOutputStream();
      output.write(IOUtils.toByteArray(new FileInputStream(new File(pathToCompleteFile))));
      output.close();
      FacesContext.getCurrentInstance().responseComplete(); 
}

完成此方法后,我尝试在 generateReport2() 中添加它:

new File(pathToCompleteFile).delete()

无论我做什么,这个方法都会返回 false。我也试过:

FileDeleteStrategy.FORCE.delete(新文件(pathToSubstitutedDoc))

但还是没有结果。

canRead()、canWrite()、canExecute() 等方法始终返回 true。 SecurityManager 也毫无异常(exception)地执行方法。问题是什么?

最佳答案

嗯,其实很简单。我忘了 FileInputStream 也应该关闭。

方法应该是这样的:

private void giveDocumentForClient(String pathToCompleteFile) throws InvalidFormatException, IOException 
{
      FileInputStream fis = new FileInputStream(new File(pathToCompleteFile));
      String fn = new File(pathToCompleteFile).getName();
      XspHttpServletResponse response = (XspHttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
      response.setContentType(URLConnection.guessContentTypeFromName(fn));
      response.setHeader("Content-disposition", "attachment; filename=" + fn);
      OutputStream output = response.getOutputStream();
      output.write(IOUtils.toByteArray(fis));
      output.close();
      fis.close();
      FacesContext.getCurrentInstance().responseComplete(); 
}

关于java - 文件交给客户后如何删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51356405/

相关文章:

javascript - 我如何遍历Javascript中的文件

ios - 如何在 Xcode 4.3 iOS 中更改文件扩展名?

java - 从支持 bean 设置参数

jsf - 根据用户权限导航到 preRenderViewEvent 中的不同页面; ExternalContext#dispatch() 不起作用

jsf - 如何配置启动托管 bean?

java - 从 JSlider 的值更改 JLabel 的值

java - 使用 "code"配置自动连接服务注入(inject)

java - 如何在 Java CardLayout 中的卡片之间传递值...这次我给出了一个很好的例子

java - Spring MVC后台进程

c++ - 在 Windows 中使用 UTF8 字符串打开文件名