Я работаю над написанием веб-приложения, которое принимает составные файлы в качестве входных данных и загружает их в экземпляр S3. Поскольку некоторые файлы могут быть очень большими, я использую собственный анализатор тела для отправки фрагментов в S3 по мере их поступления.
Я хочу выполнить проверку запроса перед загрузкой файла (чтобы убедиться, что у пользователя есть разрешение/достаточно места и т. д.). Из документации Play кажется, что расширение ActionBuilder — правильный способ сделать это. Я заметил, что в SecureSocial есть SecureActionBuilder, и я считаю, что должен расширить его, чтобы создать безопасное действие (именно то, что я хочу).
Я попробовал этот простой тест, чтобы увидеть, могу ли я распечатать идентификатор пользователя, поэтому я могу выполнять действия на основе пользователя.
object FileValidationAction extends SecuredActionBuilder {
def invokeBlock[A](request: SecuredRequest[A], block: SecuredRequest[A] => Future[SimpleResult]) = {
Logger.info("User id is " + request.user.userProfile.userId)
block(request)
}
}
Однако метод так и не был вызван.
Затем я попытался переопределить метод из объекта SecuredActionBuilder:
object FileValidationAction extends SecuredActionBuilder {
override def invokeBlock[A](request: Request[A], block: SecuredRequest[A] => Future[SimpleResult]) = {
val securedResult: Option[SecuredRequest[A]] = request match {
case r: SecuredRequest[A] => Option(r)
case _ => None
}
Logger.info("Calling action ------- WOO!")
securedResult match {
case Some(r) =>
block(r)
case _ =>
Future.successful(Forbidden)
}
}
}
Этот метод вызывается, но входящий запрос не является SecuredRequest, как я надеялся.
Как мне создать SecuredAction, используя собственный анализатор тела, который я могу проверить до того, как он завершит (или даже начнет) загрузку?
РЕДАКТИРОВАТЬ:
Чтобы уточнить, я буду вызывать действие со следующей сигнатурой метода:
def upload = FileValidationAction(streamingBodyParser(streamConstructor)) { request =>