加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

通过Iteratee与Play2/Scala将文件上传流转发到S3

发布时间:2020-12-16 09:36:46 所属栏目:安全 来源:网络整理
导读:我读了一些关于通过Iteratee将文件发送到S3的可能性,似乎允许在收到文件时发送S3块文件,并避免使用OutOfMemory来存储大文件。 我发现这个SO帖子可能几乎是我需要做的: Play 2.x : Reactive file upload with Iteratees 我真的不明白如何做,或者如果它在P
我读了一些关于通过Iteratee将文件发送到S3的可能性,似乎允许在收到文件时发送S3块文件,并避免使用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(_)))

顺便说一句,与使用经典的Java InputStream / OutputStream相比,内存消耗的差异将是什么。
我实际上能够以非阻塞的方式将一个500mb的文件转发到S3,而且使用Java AsyncHttpClient Grizzly(但我猜想也可以和Netty一起使用),因此内存消耗非常低,而不使用Iteratees。

那么使用Iteratee有什么优势?

我可以看到的一个区别是,我得到并转发给S3的InputStream在我的情况下是由一个临时文件(这是一个CXF行为)支持的,所以它可能不像Play Iteratee那样被反应

但是使用Iteratees,如果枚举器产生由连接接收的字节并通过Iteratee将其转发到S3,那么如果到S3的连接不好,并且字节不能非常快地转发,那么存储“挂起”字节?

解决方法

简单的解释?我会尽力。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读