【问题标题】:Getting a resource file as an InputStream in Playframework在 Playframework 中获取资源文件作为 InputStream
【发布时间】:2011-07-31 08:24:57
【问题描述】:
Play.classloader.getResourceAsStream(filepath); 

文件路径 - 相对于什么?项目根?游戏框架根?绝对路径?

或者可能是 Play.classloader.getResourceAsStream 的用法不对?

【问题讨论】:

    标签: java playframework


    【解决方案1】:

    在 Play Framework 中,“conf”目录位于类路径中,因此您可以将文件放在那里并使用 getResourceAsStream 打开它。

    例如,如果您创建一个文件“conf/foo.txt”,您可以使用打开它

    Play.classloader.getResourceAsStream("foo.txt");
    

    【讨论】:

    • 如果文件不是配置文件怎么办?
    • 文件不是配置文件也没关系,还是可以放到conf目录下,这样访问。
    • 对不起,我的意思是您不应该将与配置无关的文件放在 conf 目录中。其他开发人员查看您的代码时会感到混乱和困惑。
    • 我想你可以,但对我来说还是有点脏。我在下面的另一个答案中添加了一个替代方案(使用公用文件夹),但它也不完美。我认为 Play 2 需要为可以在生产模式下访问的私有资产/资源添加一个文件夹。
    • 不适用于 Play 2.3
    【解决方案2】:

    Play 2.5.x 中已弃用已接受的答案,因为对类加载器之类的全局访问正在慢慢被淘汰。处理此问题的推荐方法是注入play.api.Environment,然后使用其classLoader 获取InputStream,例如

    class Controller @Inject()(env: Environment, ...){
    
      def readFile = Action {  req =>
        ...
    
        //if the path is bad, this will return null, so best to wrap in an Option
        val inputStream = Option(env.classLoader.getResourceAsStream(path))
    
        ...
      }
    }
    

    【讨论】:

    • 你的答案看起来像 scala,而不是 java
    【解决方案3】:

    作为使用conf 目录(仅应用于与配置相关的文件)的替代方法,您可以使用public 目录并通过以下方式访问它:

     Play.classloader.getResourceAsStream("public/foo.txt")
    

    或者在 Scala 中使用:

     Play.resourceAsStream("public/foo.txt")
    

    【讨论】:

    • 这是否会使知道该 URL 的任何人都可以公开访问该文件?
    • 这是需要考虑的事情——这种方法不适合您不想公开的资源。
    【解决方案4】:

    注入Environment,然后调用environment.resourceAsStream("filename");

    例子:

    import javax.inject.Inject;
    
    public class ExampleResource extends Controller{
    
         private final Environment environment;
         
         @Inject
         public ExampleResource(Environment environment){
              this.environment = environment;
         }
    
         public void readResourceAsStream() {
              InputStream resource = environment.resourceAsStream("filename");
              // Do what you want with the stream here
         }
    }
    

    文档:https://www.playframework.com/documentation/2.8.0/api/java/play/Environment.html#resourceAsStream-java.lang.String-

    【讨论】:

      【解决方案5】:

      相对于类路径根。也就是你的WEB-INF/classes+WEB-INF/lib中的所有罐子

      【讨论】:

      • 所以playframework-wise它可能在项目内的“lib”文件夹中? getResourceAsStream 的路径将只是“/filename”?
      • 它不能在 /lib 中。它应该在一个罐子里。
      • 我把它放在一个罐子里.. 仍然 - 不起作用。是否有不同的约定或方式来关联 Playframework 架构上的资源?
      • 尝试将其放入WEB-INF/classes
      • 您是如何将文件“发送”到 getResourceAsStream 的?
      猜你喜欢
      • 2014-09-15
      • 2023-03-23
      • 2019-08-19
      • 2011-05-09
      • 1970-01-01
      • 2011-08-18
      • 2013-06-05
      • 2013-09-01
      相关资源
      最近更新 更多