не найдено: значение на контроллере для загрузки файлов - PullRequest
0 голосов
/ 29 мая 2018

реализация для загрузки файлов с потоком akka

https://github.com/playframework/play-scala-fileupload-example/blob/2.5.x/app/controllers/HomeController.scala

, но произошла ошибка компиляции.

не найдено значение: filePicData, который находится на поддержке контроллераfile: FileUploadControllerSupport.scala

[контроллер: FileUploadController.scala]

package controllers

import java.util.UUID
import javax.inject.Inject
import java.io.File
import java.nio.file.attribute.PosixFilePermission._
import java.nio.file.attribute.PosixFilePermissions
import java.nio.file.{ Files, Path }
import java.util
import javax.inject._

//for silhouette
import com.mohiva.play.silhouette.api._
import com.mohiva.play.silhouette.api.actions.SecuredRequest
import com.mohiva.play.silhouette.api.repositories.AuthInfoRepository
import com.mohiva.play.silhouette.api.services.AvatarService
import com.mohiva.play.silhouette.api.util.PasswordHasherRegistry
import com.mohiva.play.silhouette.impl.providers._
import utils.auth.{ DefaultEnv, WithProvider }

import forms.{ FileUploadForm, FileUploadFormSupport }
import models.User
import models.services.{ AuthTokenService, UserService }
import play.api.i18n.{ I18nSupport, Messages, MessagesApi }
import play.api.libs.concurrent.Execution.Implicits._
import play.api.libs.mailer.{ Email, MailerClient }
import scala.concurrent.{ ExecutionContext, Future }

//for akka stream
import akka.stream.IOResult
import akka.stream.scaladsl._
import akka.util.ByteString
import play.api._
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.MessagesApi
import play.api.libs.streams._
import play.api.mvc.MultipartFormData.FilePart
import play.api.mvc._
import play.core.parsers.Multipart.FileInfo

class FileUploadController @Inject() (
  val messagesApi: MessagesApi,
  silhouette: Silhouette[DefaultEnv],
  userService: UserService,
  authInfoRepository: AuthInfoRepository,
  authTokenService: AuthTokenService,
  avatarService: AvatarService,
  credentialsProvider: CredentialsProvider,
  passwordHasherRegistry: PasswordHasherRegistry,
  mailerClient: MailerClient,
  implicit val webJarAssets: WebJarAssets,
  //SocialProviderRegistry
  socialProviderRegistry: SocialProviderRegistry,
  //future
  ec: ExecutionContext

)
  extends Controller with I18nSupport {

 private val logger = org.slf4j.LoggerFactory.getLogger(this.getClass)

 def fileuploadview = silhouette.SecuredAction.async { implicit request =>
    Future.successful(Ok(views.html.fileUpload(request.identity, FileUploadForm.form)))
 }

 type FilePartHandler[A] = FileInfo => Accumulator[ByteString, FilePart[A]]

  private def handleFilePartAsFile: FilePartHandler[File] = {
    case FileInfo(partName, filename, contentType) =>
      val perms = java.util.EnumSet.of(OWNER_READ, OWNER_WRITE)
      val attr = PosixFilePermissions.asFileAttribute(util.EnumSet.of(OWNER_READ, OWNER_WRITE))
      val path: Path = Files.createTempFile("multipartBody", "tempFile", attr)
      val file = path.toFile
      val fileSink: Sink[ByteString, Future[IOResult]] = FileIO.toPath(path)
      val accumulator: Accumulator[ByteString, IOResult] = Accumulator(fileSink)
      accumulator.map {
        case IOResult(count, status) =>
          logger.info(s"count = $count, status = $status")
          FilePart(partName, filename, contentType, file)
      }
  }

  private def operateOnTempFile(file: File) = {
    val size = Files.size(file.toPath)
    logger.info(s"size = ${size}")
    Files.deleteIfExists(file.toPath)
    size
  }

  def upload = Action(parse.multipartFormData(handleFilePartAsFile)) { implicit request =>

    val fileOption = request.body.file("name").map {
      case FilePart(key, filename, contentType, file) =>
        logger.info(s"key = ${key}, filename = ${filename}, contentType = ${contentType}, file = $file")
        val data2 = operateOnTempFile(file)
    }

    FileUploadFormSupport.picsave(picFormData)

    Ok(s"file size = ${fileOption.getOrElse("no file")}")
  }
}

[формы;FileUploadForm.scala]

package forms

import play.api.data.Form
import play.api.data.Forms._

object FileUploadForm {

  val form = Form(
    mapping(
      "picName" -> nonEmptyText
    )(PicFormData.apply)(PicFormData.unapply)
  )

  case class PicFormData(
    picName: String
  )
}

[FileUploadFormSupport.scala]

package forms

import...

(....)

      import forms.FileUploadForm._

  def picsave(picFormData: PicFormData): Unit = {

(....)
...