gpt4 book ai didi

java - Play 框架占用磁盘空间

转载 作者:行者123 更新时间:2023-12-01 09:29:58 25 4
gpt4 key购买 nike

我成功地使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com