【问题标题】:Alpakka S3 download file from bucket, save to file, and have filename available for next part in flowAlpakka S3 从存储桶下载文件,保存到文件,并为流程的下一部分提供文件名
【发布时间】:2020-03-16 19:57:32
【问题描述】:

我正在尝试构建使用 S3 密钥的代码,然后从 S3 下载这些文件,然后将该数据保存到磁盘上带有密钥名的文件中(在流程中进一步处理所需)并作为输出返回密钥/文件名。到目前为止我所拥有的是;

    val x: Sink[String, Future[IOResult]] =
      Flow[String].flatMapConcat(key => S3.download("somebucket", key)).
        withAttributes(S3Attributes.settings(useVersion1Api)).
        collect{ case Some(x) => x._1 }.
        flatMapConcat(identity).toMat(FileIO.toPath(Paths.get("???????")))(Keep.right)

我目前拥有的下载文件,但没有; - 使用键名作为文件名 - 返回文件名(它不应该是一个接收器,而是一个流)

我将不胜感激任何指针。我刚开始使用 alpakka 和 akka 流。可能我需要以某种方式在元组中传递密钥,但我似乎无法弄清楚以后如何使用元组的那部分。

使用 cchantep 的第一个建议可能会解决;

    val s3FileSaveFlow: Flow[String, (String, ObjectMetadata), NotUsed] =
      Flow[String].flatMapConcat(key => S3.download("somebucket", key) collect{ case Some(src) => key -> src}).
        flatMapConcat{ case (key,(src,meta)) => {
          src.to(FileIO.toPath(Paths.get(key)))
          Source.single((key,meta))
        }}

【问题讨论】:

    标签: scala amazon-s3 akka-stream alpakka


    【解决方案1】:
    val x: Sink[String, Future[IOResult]] =
      Flow[String].flatMapConcat(key => 
        S3.download("somebucket", key).collect {
          case Some(src) => key -> SRC
        })
    

    然后你有key 和字节src

    如果你想看看Benji S3 DSL(我是贡献者):

    import akka.stream.scaladsl.FileIO
    
    Flow[String].flatMapConcat { objKey =>
      s3.bucket("somebucket").obj(objKey).get().
        viaMat(FileIO.toPath(Path.get("/basedir", objKey)))(Keep.right)
    }
    

    【讨论】:

    • 感谢您的帮助和建议,我已根据您的第一个建议编辑了我的答案以反映代码的更改。既然您有经验,那么 flatMapConcat 中的 Source.single 是否正确使用?
    • { src.to(FileIO.toPath(Paths.get(key))) Source.single((key,meta)) } 有副作用,不推荐
    • 返回 (key,meta) 的正确方法是什么,这样整个事情就是一个流程?检查github.com/akka/akka/pull/25242/commits/… 似乎向我暗示了在 flatmapconcat 中返回 source.single 的优化。你的想法?
    猜你喜欢
    • 2015-05-20
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 2019-09-06
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    相关资源
    最近更新 更多