如何为从 ByteString 创建的 HttpRequest/HttpEntity 设置块大小

How to set chunk size for HttpRequest/HttpEntity created from a ByteString

如果我想在 akka-http 中上传文件,我可以使用这样的方法来控制块大小:

  private def createUploadRequest(streamName: String, uri: Uri, path: Path): Future[(HttpRequest, Path)] = {
    val bodyPart = FormData.BodyPart.fromPath("data", ContentTypes.`application/octet-stream`, path, chunkSize)
    val body     = FormData(bodyPart) 
    Marshal(body).to[RequestEntity].map { entity => 
      HttpRequest(method = HttpMethods.POST, uri = uri, entity = entity) -> path
    }
  }

但是,如果我只有一个包含内容的 ByteString 并想上传它,我无法控制块大小:

  private def makeHttpRequest(streamName: String, serverInfo: ServerInfo, bs: ByteString): HttpRequest = {
    HttpRequest(
      HttpMethods.POST,
      s"http://${serverInfo.host}:${serverInfo.port}$distRoute/$streamName",
      entity = HttpEntity(ContentTypes.`application/octet-stream`, bs)
    )
  }

在从 ByteString 创建 HttpEntity 时,还有什么方法可以控制块大小吗?

创建一个Chunked entity instead of using the HttpEntity.apply方法:

import akka.http.scaladsl.model.HttpEntity.Chunked
import akka.http.scaladsl.model.HttpEntity.ChunkStreamPart

type ChunkSize = Int

val chunkedEntityFromByteString : ChunkSize => ByteString => Entity = 
  chunkSize => byteString =>
    Chunked(
      ContentTypes.`application/octet-stream`,
      Source
        .fromIterator(() => byteString sliding chunkSize)
        .map(ChunkStreamPart.apply)
    )

只是对已发布的解决方案进行了较小的更正以使其可以编译:

    type ChunkSize = Int

    val chunkedFromByteString : ChunkSize => ByteString => HttpEntity =
      chunkSize => byteString =>
        Chunked(
          ContentTypes.`application/octet-stream`,
          Source
            .fromIterator(() => byteString sliding chunkSize)
            .map(ChunkStreamPart.apply)
        )