使用play框架即时下载档案文件

时间:2019-05-29 08:20:42

标签: scala zip streaming playframework-2.3 archive-file

我正在尝试创建和下载存档文件而不依赖于内存(以避免大文件出现内存不足异常),为此,我找到了一个示例:https://gist.github.com/kirked/412b5156f94419e71ce4a84ec1d54761,但是此示例使用一个将来的选项Input Stream作为要存档的数据源,我首先尝试通过将Future(None)传递到ZipEnumerator对象的apply方法来创建和下载空的zip文件,如下所示:

val sources =fileNames.map(file=> 
ZipEnumerator.Source(file, { () => Future(None)}))

因此,我可以下载并打开空的存档文件。但是,当我创建一个将Enumerator[Elem]转换为方法时(由于我要存档的数据来自elem的枚举器,而不是inputStream),因此我下载了文件并尝试打开它,但出现以下异常:加载归档文件时发生错误。 所以这是负责转换的方法:

Future[Option[InputStream]]

这是电话:

def enumeratorToInputStream(enumerator: Enumerator[Elem]): Future[Option[InputStream]] = {
val pos = new PipedOutputStream()
val pis = new PipedInputStream(pos)
val it = Iteratee.foreach[Array[Byte]](pos.write)  
 Await.result(enumerator.map(node=> node.mkString("char UTF-8").getBytes("UTF-8")).onDoneEnumerating(pos.close()) |>>> it, Duration.Inf)
Future(Some(pis))}

0 个答案:

没有答案