我有一个按钮可以为客户端生成 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/