Play框架获取服务器端资产

3
这似乎应该非常简单,但我无法弄清楚。我需要从我的应用程序服务器端的 /public 文件夹中获取文件。我可以使用 JavaScript 或 HTML 轻松获取它们。我正在使用 Java,Play 2.2.1。
我尝试过对此进行调整。
Assets.at("/public", "images/someImage.png");

但我不确定如何将该操作对象转换为文件对象。


你只需要将它作为一个“文件”打开即可。例如:new File("public/images/someImage.jpg"); - Michael Zajac
2个回答

2

在部署环境中(使用$ activator stage),'public'文件夹可能不存在于文件系统中,因为资源被打包成位于target/universal/stage/lib/<PROJECT_NAME>-assets.jar的.jar文件。

因此,据我所知,无法获取到该位置的java.io.File实例。

然而,我发现以下方法可以读取文件的字节(并将它们转换为字符串 - 这是我需要的):

SomeController.java

private String getSomeFile() throws IOException {
    InputStream in = null;
    ByteArrayOutputStream out = null;

    try {
        in = Play.application().resourceAsStream("public/some/file.txt");
        out = new ByteArrayOutputStream();
        int len;
        byte[] buffer = new byte[1024 * 16];

        while ((len = in.read(buffer)) >= 0) {
            out.write(buffer, 0, len);
        }

        return new String(out.toByteArray(), "utf-8");
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) { /* ignore */ }
        }
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) { /* ignore */ }
        }
    }
}

注意:我使用的是Play 2.3.7版本,不确定在2.2.1版本上是否适用。希望这能帮助到大家。

-1

Play.application().getFile会相对于当前应用程序路径加载文件。

因此:

Play.application().getFile("public/images/someImage.png");

3
当我在本地主机上运行服务器时,这个方法可以获取文件,但一旦打包并部署后,该文件将位于此处/projectName/projectName-version/lib/projectName.jar/public/images/someImage.png。必须有一种更简单的方法来获取该文件,而不需要使用ClassLoader或其他获取jar中文件的方式。难道我不能模仿JavaScript的做法吗(@routes.Assets.at("images/someImage.png"))? - Alex03
getFile获取相对于应用程序路径的文件,那么为什么在这种情况下它不起作用呢?无论如何,除非文件在类路径中,否则Play不会从文件系统中提供任意文件。 - Ryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接