【问题标题】:Akka file upload - Sending an 2xx 'early' response before end of request was receivedAkka 文件上传 - 在收到请求结束之前发送 2xx“早期”响应
【发布时间】:2018-09-04 21:36:24
【问题描述】:

我知道这里已经有人问过这个问题,但我还没有找到任何可行的解决方案。一直收到此警告:在收到请求结束之前发送 2xx“早期”响应。

这是我的代码:

pathPrefix("upload") {
  (post & extractRequest) { _ => {
    extractRequestContext {
      requestCtx => {
        println(requestCtx.request.toString)
        implicit val materializer = requestCtx.materializer
        implicit val executionContext = requestCtx.executionContext
        fileUpload("file") {
          case (metadata, byteSource) => {

            val completesOnceUploadCompleted: Future[Done] =
              byteSource.runWith(FileIO.toPath(Paths.get(metadata.fileName))).map(
                iores => iores.status.get
              )

            val futureResponseBody = completesOnceUploadCompleted.map(res => res)
            complete(futureResponseBody)
          }
        }
      }
    }
  }

  }
}

请帮我修一下。

【问题讨论】:

  • 您的代码似乎工作正常(akka-actor/stream 2.4.20,akka-http 10.0.11)。
  • 它适用于 ~50kb 的小文件,当我上传 ~1MB 文件时,它会生成上述警告,我尝试了旧版本的 akka,然后升级到最新版本,没有任何变化。
  • HTTP 是否允许提前响应(例如,在请求被消费之前)?

标签: scala file-upload akka-stream akka-http


【解决方案1】:

我不确定潜在问题的原因。但是,一个“快速修复”是使用 onComplete 指令等待写入完成:

pathPrefix("upload") {
  post {    
    extractRequestContext { requestCtx => 
      println(requestCtx.request.toString)
      implicit val materializer = requestCtx.materializer
      implicit val executionContext = requestCtx.executionContext

      fileUpload("file") { (metadata, byteSource) =>

        val writeFileFut : Future[Try[Done]] = 
          byteSource.runWith(FileIO.toPath(Paths.get(metadata.fileName)))
                    .map(_.status)

        onComplete(writeFileFut) {
          case Success(statusTry) => statusTry match {
            case Success(done) => complete(StatusCodes.Ok)
            case Failure(ex) => complete(StatusCodes.InternalServerError -> ex.toString)
          }
          case Failure(ex) => complete(StatusCodes.InternalServerError -> ex.toString)
        }
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,只需添加implicit request: Request[AnyContent] =>(我错误地删除了)就解决了!

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2013-03-13
      • 1970-01-01
      相关资源
      最近更新 更多