播放框架默认的tmp文件夹路径

时间:2017-12-06 12:27:55

标签: scala playframework

tmp文件的默认路径是什么?例如,在将文件上传到服务器之后,playframework将它们放到tmp文件夹中。哪个文件夹使用playframework?我找不到任何文件。如果我知道这个tmp文件夹路径,那么我可以用它来检索tmp文件。 我正在使用playframework 2.6版本。

修改:添加了scala代码

2 个答案:

答案 0 :(得分:3)

默认情况下,Play使用名为play.api.libs.Files.DefaultTemporaryFileCreator的类来创建其文件。该类使用java.nio.file.Files.createTempDirectory("playtemp")创建其临时目录。我不认为你可以很容易地获得这个目录的位置。

您可以通过使用依赖注入(JavaScala)覆盖TemporaryFileCreator并提供自己的逻辑来注入您自己的实现。

如果您只想访问上传的文件,那么无论如何您都可以在请求期间访问底层临时文件。在Java API中,只需调用MultipartFormData.getFiles;在Scala API调用MultipartFormData.file("name")中。这些来电会给你一个FilePart。在Java中,File存储在FilePart' file字段中;在Scala中,它位于ref属性中。

答案 1 :(得分:0)

对于那些想知道如何覆盖DefaultTemporaryFileCreator绑定到特征TemporaryFileCreator Play的人来说。

创建您自己的实现

package modules

import java.io.File

import javax.inject.{ Inject, Singleton }
import play.api.inject.ApplicationLifecycle
import play.api.libs.Files.DefaultTemporaryFileCreator

@Singleton
class CustomTemporaryFileCreator @Inject() (applicationLifecycle: ApplicationLifecycle)
  extends DefaultTemporaryFileCreator(applicationLifecycle) {

  override def create(prefix: String, suffix: String): File = {

    val file = super.create(prefix, suffix)
    file.setReadable(true, false)
    file
  }

}

创建您自己的应用程序模块,扩展Play提供的内置模块。

您需要过滤要替换的内置绑定,然后添加覆盖,否则将有2个绑定用于相同的特征,并且注入器会抱怨。

package modules

import play.api.{Configuration, Environment}
import play.api.inject.{Binding, BuiltinModule}
import play.api.libs.Files

class MyAppModule extends BuiltinModule {

  override def bindings(env: Environment, configuration: Configuration): Seq[Binding[_]] = {
    val overrides = List(
      bind[Files.TemporaryFileCreator].to[CustomTemporaryFileCreator]
    )

    def isOverride(binding: Binding[_]): Boolean = overrides.exists(_.key.clazz == binding.key.clazz)

    overrides ++ super.bindings(env,configuration).filterNot(isOverride)
  }

}

用您自己的模块替换现有的内置模块

play.modules.disabled += "play.api.inject.BuiltinModule"
play.modules.enabled += "modules.MyAppModule"