java - Play 框架占用磁盘空间

标签 java scala playframework

我成功地使用 Play 框架提供视频,但遇到了一个问题:每次提供文件时,Play 框架都会在 C:\Users\user\AppData\Temp 中创建一个副本。我正在提供大文件,因此这很快就会造成磁盘空间问题。

有没有办法在 Play 中提供文件而不创建副本?或者让 Play 自动删除临时文件?

我用来提供服务的代码本质上是:

public Result video() {
    return ok(new File("whatever"));
}

最佳答案

使用流媒体

我使用以下方法进行视频流。此代码不会创建媒体文件的临时副本。

基本上,此代码响应浏览器发送的RANGE查询。如果浏览器不支持 RANGE 查询,我会回退到尝试使用 Ok.sendFile 发送整个文件的方法(内部 Play 也会尝试流式传输文件)(此可能会创建临时文件)。但当浏览器不支持范围查询时,这种情况很少发生。

GET   /media       controllers.MediaController.media

将此代码放入名为 MediaControllerController

def media = Action { req =>
     val file = new File("/Users/something/Downloads/somefile.mp4")
     val rangeHeaderOpt = req.headers.get(RANGE)
     rangeHeaderOpt.map { range =>
       val strs = range.substring("bytes=".length).split("-")
       if (strs.length == 1) {
         val start = strs.head.toLong
         val length = file.length() - 1L
         partialContentHelper(file, start, length)
       } else {
         val start = strs.head.toLong
         val length = strs.tail.head.toLong
         partialContentHelper(file, start, length)
       }
     }.getOrElse {
       Ok.sendFile(file)
     }
   }

   def partialContentHelper(file: File, start: Long, length: Long) = {
     val fis = new FileInputStream(file)
     fis.skip(start)
     val byteStringEnumerator = Enumerator.fromStream(fis).&>(Enumeratee.map(ByteString.fromArray(_)))
     val mediaSource = Source.fromPublisher(Streams.enumeratorToPublisher(byteStringEnumerator))
     PartialContent.sendEntity(HttpEntity.Streamed(mediaSource, None, None)).withHeaders(
       CONTENT_TYPE -> MimeTypes.forExtension("mp4").get,
       CONTENT_LENGTH -> ((length - start) + 1).toString,
       CONTENT_RANGE -> s"bytes $start-$length/${file.length()}",
       ACCEPT_RANGES -> "bytes",
       CONNECTION -> "keep-alive"
     )
   }

关于java - Play 框架占用磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39521273/

相关文章:

java - 由于文件路径中有空格,创建 xml 文件时出错

json - 将嵌套对象编码为字符串

java - 如何在h2数据库Play Framework 2.7.3中搜索?

scala - 构建 play 2.0 项目时 Unresolved 依赖关系

java - spring中的Model对象刷新页面时获取空值

java - HTTP 状态 404 -/com.demo/rest/hello - 使用 Rest 项目

java - 如何在java中保存非常大的二进制代码

java - 使用 Scala swing 的经验,它如何添加到 Java swing 中已经可用的内容?有什么挑战吗?

scala - 如何使用 Map[String,Long] 列作为 DataFrame 的头部并保留类型?

java - IntelliJ 未正确创建/导入新的 Play Framework 项目