Я хотел бы пополнить zip, созданный «на лету» (не помещая его полностью в память) с помощью play-framework 2.5, используя поток akka с противодавлением. Здесь мой код с небольшим zip, созданным «на лету» (16 КБ). Когда клиент загружает URL-адрес, связанный с действием, загрузка не запускается.поток zip, созданный на ходу с игрой 2.5 и аккой с обратным протиранием
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"
)
}
}
В принципе, я хочу передать zip-файл 2 ГБ на 1 ГБ сервер памяти. И этот zip будет состоять из файлов размером около 15 МБ. Можно ли написать zip без загрузки полностью каждого файла в память? Если скажем, что 3 клиента загружают zip со скоростью 1MB/second. Примерно, сколько памяти будут загружены эти загрузки? Заранее спасибо.
Вы могли бы поразить это: https://github.com/playframework/playframework/issues/6743 – Somatik