【发布时间】:2017-01-21 13:52:31
【问题描述】:
我想使用带有背压的 akka 流使用 play-framework 2.5 流式传输动态创建的 zip(而不将其完全放在内存中)。这是我的代码,带有一个动态创建的小 zip (16KB)。当客户端下载与操作关联的 url 时,下载不会开始。
import java.util.zip.{ ZipEntry, ZipOutputStream, GZIPOutputStream }
import akka.stream.scaladsl._
import akka.util.ByteString
import play.api.mvc._
import scala.concurrent.duration._
import java.io.{ BufferedOutputStream, ByteArrayOutputStream }
import scala.concurrent.{ Promise, Future }
import akka.stream.OverflowStrategy
class ZipController extends Controller {
def getStreamedZip = Action {
val source: Source[ByteString, java.io.OutputStream] = StreamConverters.asOutputStream()
val result = source.mapMaterializedValue(x => {
val zip = new ZipOutputStream(x)
(0 to 100).map { i =>
zip.putNextEntry(new ZipEntry("test-zip/README-" + i + ".txt"))
zip.write("This is the line:\n".map(_.toByte).toArray)
zip.closeEntry()
}
zip.close
x
})
Ok.chunked(result).withHeaders(
"Content-Type" -> "application/zip",
"Content-Disposition" -> "attachment; filename=test.zip"
)
}
}
基本上,我想在 1 GB 内存服务器上流式传输 2GB 的 zip 文件。这个 zip 将由大约 15MB 的文件组成。是否可以在不完全加载内存中的每个文件的情况下编写 zip 文件?如果假设 3 个客户端以 1MB/秒的速度下载 zip。这些下载大约需要多少内存?提前谢谢你。
【问题讨论】:
标签: scala playframework akka