我需要编写一个Grails(或Java)应用程序来处理身份验证(来自我们专有的Single Sign On系统),然后经过身份验证后允许用户下载文件。如果我只是将文件包含在应用程序的WAR文件中,这是非常简单的,但是,我想避免这种情况,因为会有多个文件,而且每次我们都不需要上传新的WAR文件添加一个新文件。是否可以通过将应用程序放在WAR文件中但WAR文件外的文件来实现这一点,如果是这样,我该如何配置这种设置?我们将在Tomcat上运行它。
答案 0 :(得分:0)
是的,这是可能的。在不了解您的所有要求或您尝试过的内容以及为什么它不能为您工作的情况下,我能做的最好的事情就是让您大致了解如何实现这一目标。
让控制器获取您希望用户下载的文件的ID。基于此键找到关联的Domain实例。域应该存储文件的文件名。然后使用此文件名从本地文件系统解析文件(在应用程序配置中配置的路径)。打开文件并将内容流式传输到浏览器。请务必正确设置标题以指示文件名和大小。
这里涉及很多活动部件,但可以做到。现在,如果你遇到困难,我建议你发布你尝试过的东西以及什么不起作用。否则,我们/我能做的最好的就是给你一般的指导/建议。
希望这有帮助!
修改强> 真正的密钥将在控制器中用于下载文件。以下是一个可能类似的快速摘录:
String fileName = "something.zip" // should come from your domain instance
String filePathAndName = "/downloads/${fileName}" // should come from your configuration
response.setContentType("application/octet-stream")
response.setHeader("Content-disposition", "attachment;filename=${fileName")
// this will actually buffer/stream the file in 8k chunks instead of reading the entire file into memory.
org.apache.commons.io.IOUtils.copy((new File(filePathAndName)).openStream(), response.outputStream)
response.outputStream.flush()
response.outputStream.close()