2014-11-24 66 views
3

這似乎應該是非常容易的,但我無法弄清楚。我需要從我的應用程序服務器端的/ public文件夾中獲取文件。我可以讓他們使用JavaScript或HTML沒有問題。我使用Java,玩2.2.1Play Framework獲取資產服務器端

我已經試過瞎搞這個

Assets.at("/public", "images/someImage.png"); 

,但我不知道如何把這一行動的對象爲File對象。

+0

你應該能夠打開它作爲'文件'。即''new File(「public/images/someImage.jpg」);' – 2014-11-24 23:13:06

回答

-1

Play.application().getFile將加載相對於當前應用程序路徑的文件。

所以:

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

這適用於在本地主機上運行服務器時獲取文件,但一旦它打包並部署,文件位於/ projectName/projectName -version/lib目錄/ projectName.jar /公/圖片/ someImage.png。必須有一種更簡單的方式來獲取不涉及ClassLoader的文件或將文件從jar中移出的東西。難道我不知何故模仿JavaScript的做法(@ routes.Assets.at(「images/someImage.png」)) – Alex03 2014-11-25 17:10:51

+0

'getFile'獲取文件*相對*的應用程序路徑,爲什麼它不工作在那種情況下?在任何情況下,除非文件系統位於類路徑中,否則Play不會爲文件系統提供任意文件。 – Ryan 2014-11-25 17:53:51

2

的「公共」文件夾可能不會在部署環境的文件系統中(使用$ 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上工作。

希望這可以幫助任何人。

相關問題