播放框架默认TMP文件夹路径



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

edit :添加scala标签

默认情况下播放使用一个名为 play.api.libs.Files.DefaultTemporaryFileCreator的类来创建其文件。该类使用java.nio.file.Files.createTempDirectory("playtemp")创建其临时目录。我认为您无法轻易获得此目录的位置。

您可以覆盖TemporaryFileCreator,并使用依赖注入(Java,Scala)注入您自己的实现。

如果您只想访问已上传的文件,则无论如何,您确实可以访问基础临时文件。在Java API中,只需致电MultipartFormData.getFiles;在Scala API中调用MultipartFormData.file("name")。这些电话将为您提供FilePart。在Java中,File存储在FilePartfile字段中;在Scala中,它在ref属性中。

对于那些想知道如何覆盖 DefaultTemporaryFileCreator的人,binded binded to play的特质 TemporaryFileCreator

创建自己的实现

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"

使用Java java.nio.file.Files.createTempFile方法

创建示例文件后
// Inside a Scala worksheet
import java.nio.file.Files
import java.io.File
val sampleFile: File = Files.createTempFile("sample", ".txt").toFile
println(sampleFile.getPath)

打印文件的path在MacOS上显示了这一点:

/var/folders/jp/1sslmypy5thyn7wv8lfq1s3c0000gq/T/sample6927805051598358327.txt

这可能是应用程序的每个运行的不同目录。

因此,如果在运行时需要完整的路径,则getPath是获得它的可行选择。

最新更新