Загрузка файла Akka - отправка 2xx «раннего» ответа до получения конца запроса - PullRequest
0 голосов
/ 05 сентября 2018

Я знаю, что этот вопрос уже задавался здесь, но я не нашел никакого рабочего решения этой проблемы. Постоянно получайте это ПРЕДУПРЕЖДЕНИЕ: отправка 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)
          }
        }
      }
    }
  }

  }
}

Пожалуйста, помогите мне исправить это.

1 Ответ

0 голосов
/ 06 сентября 2018

Я не уверен в причине основной проблемы. Однако одним из "быстрых решений" было бы использование директивы 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)
        }
      }
    }
  }
}
...