這似乎應該是非常容易的,但我無法弄清楚。我需要從我的應用程序服務器端的/ public文件夾中獲取文件。我可以讓他們使用JavaScript或HTML沒有問題。我使用Java,玩2.2.1Play Framework獲取資產服務器端
我已經試過瞎搞這個
Assets.at("/public", "images/someImage.png");
,但我不知道如何把這一行動的對象爲File對象。
這似乎應該是非常容易的,但我無法弄清楚。我需要從我的應用程序服務器端的/ public文件夾中獲取文件。我可以讓他們使用JavaScript或HTML沒有問題。我使用Java,玩2.2.1Play Framework獲取資產服務器端
我已經試過瞎搞這個
Assets.at("/public", "images/someImage.png");
,但我不知道如何把這一行動的對象爲File對象。
Play.application().getFile
將加載相對於當前應用程序路徑的文件。
所以:
Play.application().getFile("public/images/someImage.png");
這適用於在本地主機上運行服務器時獲取文件,但一旦它打包並部署,文件位於/ projectName/projectName -version/lib目錄/ projectName.jar /公/圖片/ someImage.png。必須有一種更簡單的方式來獲取不涉及ClassLoader的文件或將文件從jar中移出的東西。難道我不知何故模仿JavaScript的做法(@ routes.Assets.at(「images/someImage.png」)) – Alex03 2014-11-25 17:10:51
'getFile'獲取文件*相對*的應用程序路徑,爲什麼它不工作在那種情況下?在任何情況下,除非文件系統位於類路徑中,否則Play不會爲文件系統提供任意文件。 – Ryan 2014-11-25 17:53:51
的「公共」文件夾可能不會在部署環境的文件系統中(使用$ activator stage
),在資產被打包到位於target/universal/stage/lib/<PROJECT_NAME>-assets.jar
.jar文件。
因此,獲取java.io.File實例到該位置是AFAIK不可能的。
但是,這是我想通了讀取文件的字節(並將其轉換爲一個字符串 - 這就是我需要的東西):
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 */ }
}
}
}
注:我用播放2.3.7。我不確定這是否會在2.2.1上工作。
希望這可以幫助任何人。
你應該能夠打開它作爲'文件'。即''new File(「public/images/someImage.jpg」);' – 2014-11-24 23:13:06