Grails 3加载静态文件

时间:2016-06-01 18:51:52

标签: java grails groovy

我在Grails 3应用程序的assets文件夹中有几个PDF文件。我想在用户点击某个按钮时加载它们。即用户单击“获取第一本书”按钮,并且grails控制器查找assets文件夹中的所有文件,直到找到匹配项,然后返回正确的文件。

目前,我通过直接访问路径来加载文件。即我正在使用明确的aboslute路径。根据这个post,这是一种可行的方法。但是,我想通过要求我的应用程序获取资产文件夹中的所有资源而不是使用任何路径来加载grails中的文件。

我的问题是,是否可以通过简单的方式从assets文件夹中获取所有文件,就像我们可以在yml文件中获取属性一样(grailsApplication.config.someProperty)

2 个答案:

答案 0 :(得分:1)

这段代码为我做了类似的事情(但是,我的文件位于我的项目目录之外)。它是一个控制器方法,它接收文件名(id)和文件类型(filetype)并查找预定义的目录。我认为你只需要调整你的服务器位置"和" contentLocation"。

获取可以传递给视图的文件列表:

List listOfNewsletters = []

String contentLocation = grailsApplication.config.managedNewsletter.contentLocation;

File rootDirectory = new File(servletContext.getRealPath("/"));
File webappsDirectory = rootDirectory.getParentFile();
String serverLocation = webappsDirectory.getAbsolutePath();

serverLocation = serverLocation + contentLocation + "/";

File f = new File(serverLocation);

if (f.exists()) {
    f.eachFile() { File file ->
         listOfNewsletters.push([
              path: file.path,
              filename: file.name,
              filetype: "pdf"
         ])
     }
}

发送文件:

def openNewsletter() {
        if (params.id != null && params.filetype != null) {

            String pdf = (String) params.id + "." + (String) params.filetype;    

            String contentLocation = grailsApplication.config.managedNewsletter.contentLocation;

            File rootDirectory = new File(servletContext.getRealPath("/"));
            File webappsDirectory = rootDirectory.getParentFile();
            String serverLocation = webappsDirectory.getAbsolutePath();           

            serverLocation = serverLocation + contentLocation + "/";

            File pdfFile =new File(serverLocation + pdf);

            response.contentType  = 'application/pdf' // or whatever content type your resources are
            response.outputStream << pdfFile.getBytes()
            response.outputStream.flush()
        }
    }

答案 1 :(得分:1)

在此处找到解决方案:Grails : getting assets local storage path inside the controller

以下示例:

def assetResourceLocator

assetResourceLocator?.findAssetForURI('file.jpg')?.getInputStream()?.bytes

对我来说很好。