- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了一些关于通过 Iteratee 将文件发送到 S3 的可能性的内容,这似乎允许在我们收到文件时发送 S3 文件 block ,并避免大文件的 OutOfMemory 例如。
我发现这个 SO 帖子可能几乎是我需要做的:
Play 2.x : Reactive file upload with Iteratees
我真的不明白该怎么做,或者它是否真的在 Play 2.0.2 中可用(因为 Sadek Brodi 说 foldM 仅在 Play 2.1 中可用)
对于已经阅读过一些关于 Iteratees 的博客但还不是 Scala/Play2 专家的人,有人可以用简单的方式解释一下吗?
我什至不知道我是否应该使用多部分正文解析器或类似的东西,但我知道的一件事是我不明白这段代码在做什么:
val consumeAMB =
Traversable.takeUpTo[Array[Byte]](1028*1028) &>> Iteratee.consume()
val rechunkAdapter:Enumeratee[Array[Byte],Array[Byte]] =
Enumeratee.grouped(consumeAMB)
val writeToStore: Iteratee[Array[Byte],_] =
Iteratee.foldM[Array[Byte],_](connectionHandle){ (c,bytes) =>
// write bytes and return next handle, probable in a Future
}
BodyParser( rh => (rechunkAdapter &>> writeToStore).map(Right(_)))
最佳答案
简单的解释? 我会尽力。 :)
您正在用组件构建管道。一旦你构建了管道,它就可以被发送数据。它是一个 Iteratee,所以它知道如何迭代数据。
您要上传的文件包含在请求正文中,而 BodyParser 是在 Play 中处理请求正文的。因此,您将迭代管道放入 BodyParser。当发出请求时,您的管道将被发送数据(它将对其进行迭代)。
您的管道 (rechunkAdapter &>> writeToStore
) 将数据分成 1MB 位,然后将它们发送到 S3。
管道的第一部分 (rechunkAdapter
) 进行分 block 。它实际上有自己的迷你管道来进行分 block ( consumeAMB
)。一旦迷你管道接收到足够的数据来组成一个 block ,它就会将它发送到主管道。
管道的第二部分 (writeToStore
) 就像一个循环,在每个 block 上被调用,让您有机会将每个 block 发送到 S3。
迭代器的优点?
一旦您知道发生了什么,您就可以通过将组件连接在一起来构建迭代管道。并且类型检查器通常会在您错误地将某些东西连接在一起时告诉您。
例如,我们可以修改上面的管道来修复它很慢的事实。它可能很慢,因为只要一个 block 准备好上传到 S3,请求上传就会暂停。放慢请求上传速度很重要,这样我们就不会耗尽内存,但我们可以通过添加一个固定大小的缓冲区来更宽容一点。所以只需添加 Concurrent.buffer(2)
进入管道的中间以缓冲最多 2 个 block 。
Iteratees 为流提供了一种功能方法。这是优点还是缺点,取决于您对函数式编程的感受。 :) 与惰性流(另一种功能方法)相比,迭代提供了对资源使用的精确控制。
最后,迭代器允许我们相对简单地(!)进行非常复杂的异步流编程。我们可以在不持有线程的情况下处理 IO,这是可扩展性的巨大胜利。经典的 Java InputStream/OutputStream 示例需要 2 个线程。
关于scala - 使用 Play2/Scala 通过 Iteratee 将文件上传流转发到 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12609451/
我正在尝试做的一个小项目遇到了一个小问题。我正在尝试使用 Java 程序调用 Python 脚本。 Java: ProcessBuilder pb = new ProcessBuilder("pyth
我正在编写一个 Web 应用程序来管理和查看来自 ONVIF 网络摄像机的流。 它是用 nodejs 编写的。这个想法是在节点中运行一个子进程并将输出管道输出到节点,然后将缓冲区发送到客户端并将其呈现
我是一名优秀的程序员,十分优秀!