【问题标题】:Playframework [Scala]: How to display an image file in view / [error] class MultipartFormData that takes type parametersPlayframework [Scala]:如何在视图中显示图像文件 / [错误] 类 MultipartFormData 采用类型参数
【发布时间】:2018-06-07 12:14:37
【问题描述】:

我想在视图中显示上传的文件;但是我不知道该怎么做。

首先我尝试将multipartFormData 传递给视图文件,但发生错误:

类 MultipartFormData 采用类型参数

问题出在下面一行:

@(user: models.User, file: MultipartFormData, fileOption: Option[Long])(隐式请求: RequestHeader, messages: Messages, webJarAssets: WebJarAssets)

在我的控制器类 (FileUploadController.scala) 中,我有以下内容:

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

  def handleFilePartAsFile: FilePartHandler[File] = {
    case FileInfo(partName, filename, contentType) =>
      val attr = PosixFilePermissions.asFileAttribute(util.EnumSet.of(OWNER_READ, OWNER_WRITE))
      val path: Path = Files.createTempFile("multipartBody", "tempFile", attr)

      if (Files.notExists(path)) Files.createFile(path)

      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)
      }
  }

  def upload = silhouette.SecuredAction.async(parse.multipartFormData(handleFilePartAsFile)) { implicit request =>

    val fileOption = request.body.file("picName").map {

      case FilePart(key, filename, contentType, file) =>
        logger.info(s"key = ${key}, filename = ${filename}, contentType = ${contentType}, file = $file")

        val data = operateOnTempFile(file)

    FileUploadFormSupport.picsave(key, filename, contentType, file)

        data

    }

    Future.successful(Ok(views.html.fileUpload2(request.identity, request.body.file("picName"), fileOption)))
    }
}

在我的视图文件 (fileupload2.scala.html) 中,我有以下内容:

@(user: models.User, file: MultipartFormData, fileOption: Option[Long])(implicit request: RequestHeader, messages: Messages, webJarAssets: WebJarAssets)

@import b3.inline.fieldConstructor

@main(Messages("fileupload.title"), Some(user)) {

   <div class="user col-md-6 col-md-offset-3">
        <div class="row data">
            <div class="col-md-12">
                <div class="row">

                <img src="file">
                    <p class="col-md-6"><strong>@Messages("file.name"):</strong></p>
                    <p class="col-md-6">file size is @fileOption.getOrElse("None")</p>
                </div>
            </div>
        </div>
    </div>

}

【问题讨论】:

  • MultipartFormData 似乎应该是 MultipartFormData[something],类似于您的 Option[Long]。至少在引用类型参数时就是这个意思。
  • 感谢您的评论,詹姆斯。我也想过,但是比如[File]和[FilePart]都没有通过,就别想了……
  • 为什么picName 的类型是MultipartFormData
  • 感谢您的评论,戴夫。对不起,粗心的错误。修好了。
  • 我知道 TemporaryFile 是默认类型,然后修改为 MultipartFormData[TemporaryFile] 但出现错误“未找到:值 TemporaryFile”。 github.com/playframework/…

标签: scala playframework akka


【解决方案1】:

解决了。

修改为 MultipartFormData[_] 时,类型不匹配;

发现[错误]:Option[play.api.mvc.MultipartFormData.FilePart[java.io.File]]

需要[错误]:play.api.mvc.MultipartFormData[_]

发生了。

那么我应该在视图中这样写:

@(file: Option[MultipartFormData.FilePart[java.io.File]])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多