【问题标题】:Download pdf file from s3 using akka-stream-alpakka and store it as an array of bytes使用 akka-stream-alpakka 从 s3 下载 pdf 文件并将其存储为字节数组
【发布时间】:2020-05-22 07:38:23
【问题描述】:

我正在尝试使用 akka-stream-alpakka 连接器从 S3 下载 pdf 文件。我有 s3 路径,并尝试使用 alpakka s3Client 上的包装方法下载 pdf。

def getSource(s3Path: String): Source[ByteString, NotUsed] = {
    val (source, _) = s3Client.download(s3Bucket, s3Path)
    source
  }

从我的主代码中,我调用上述方法,获取 pdf 源并能够下载 pdf。但是,我现在需要将 pdf 作为字节数组保存在内存中,而不是下载文件,以便我可以执行一些其他处理。

我当前的代码看起来像这样

val filePath = "certificate.pdf"
val value1: Future[IOResult] =
  awsS3Bucket
    .getSource(data.s3PdfPath)
    .toMat(FileIO.toPath(Paths.get(filePath)))(Keep.right)
    .run()

我尝试了一些组合,但都不成功。有人可以指出需要在上面的代码中进行哪些更改,以便使用value1Future[Array[Bytes]] 而不是Future[IOResult]

TIA。

【问题讨论】:

  • “不成功”是什么意思?遇到错误?

标签: scala amazon-s3 akka-stream alpakka


【解决方案1】:

我认为 IOResult 只是下载的状态:

final case class IOResult(count: Long, status: Try[Done])

所以如果要获取Array[Bytes],需要在下载完成后将pdf加载到内存中。

value1.onComplete {
  case Success(_) => {
    // load pfile into MEM here
  }
  case Failure(e) => {
    e.printStackTrace()

  }
}

【讨论】:

  • 将整个文件加载到内存中完全破坏了流媒体
  • @cchantep 我完全理解你的意思,但我的要求是我需要将文件作为 Array[Byte] 下载,然后将此文件作为电子邮件的附件发送。电子邮件客户端不接受流式 API,并且基于传统的阻塞调用。因此,我别无选择,只能将此文件作为字节数组下载,然后将其作为附件添加到电子邮件中。
猜你喜欢
  • 2020-05-19
  • 2021-11-23
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 2020-03-16
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
相关资源
最近更新 更多