繁体   English   中英

Play Framework占用了磁盘空间

[英]Play Framework eating up disk space

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

有什么方法可以在Play中提供文件而不创建副本吗? 还是让Play自动删除了临时文件?

我使用的代码本质上是:

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

使用流媒体

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

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

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"
     )
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM