image - Play Framework : Handling dynamic created files (images) in PRODUCTION mode

标签 image scala playframework playframework-2.2 playframework-2.3

我试图允许用户将照片上传到服务器,然后在生产(而非开发)中查看它们(所有用户都可以查看所有照片)。在开发模式下,一切都很简单 - 我可以将文件上传到公共(public)文件夹,然后从那里读取,在生产模式下,我无权访问公共(public)文件夹文件夹不再存在(因为此方法适用于静态访问,而不是动态访问)。

所以,我有两个问题:

  1. 上传:目前我无法理解如何将上传的照片保存到特定文件夹,而不使用我想要保存照片的位置的绝对路径。

这是上传代码(类似于本指南 - https://www.playframework.com/documentation/2.4.x/ScalaFileUpload):

def uploadPhoto = Action(parse.multipartFormData) { request =>
  import play.api.mvc.MultipartFormData
  import play.api.libs.Files.TemporaryFile
  import java.io.File
  import java.nio.file.Path
  import java.nio.file.Paths

  try {
    val multipartForm: MultipartFormData[TemporaryFile] = request.body

    val pathDev: Path = Paths.get("./public/img");
    val pathProduction: Path = Paths.get("/...<[full path]>.../public/img");
    val imgPath =
      if (Files.exists(pathDev)) { pathDev.toString() } 
      else { pathProduction.toString() }

    val newFile = img.get.ref.moveTo(new File(s"$imgPath/$imgName"))
    // [HERE I save the path to my DB]
    Ok(Json.obj("imgName" -> imgName))

  } catch {
    case e: Exception =>
      BadRequest("unknown error")
  }
}
  • 我不清楚如何将上传的图像返回给想要查看它们的用户。 我想动态更改 img html 标签中的 scr 以显示相关图像,如下所示: $("#img").attr("src",'assets/img/1.jpg');
  • 但是由于公共(public)文件夹不可用,因此图像“不存在”(至少在我“暂存”项目并重新运行它之前 - https://www.playframework.com/documentation/2.4.x/Assets )。

    我尝试了以下方法( https://www.playframework.com/documentation/2.4.x/ScalaStream ): 我已将以下行添加到我的 conf/routes 文件中: GET/img/:文件名controllers.MyController.getPhoto(文件名)

    并在 Controller 中定义了以下函数: def getPhoto(文件名:字符串) = 操作 { Ok.sendFile(new java.io.File("./img/"+ 文件名)) }

    但是浏览器正在下载文件而不是显示它......

    这些是相关的: Handling dynamic created files in play 2 How to serve uploaded files in Play!2 using Scala?

    任何帮助都将非常适当。

    最佳答案

    这是我解决这个问题的方法

    问题 1

    对于上传文件路径,在游戏中您可以在conf/application.conf文件中定义配置,并且您可以在生产模式下使用不同的文件,使用-Dconfig.file=/path/to/the/file。

    所以我定义了一个名为 myapp.image.base 的属性,在 Debug模式下只需将其设置为“”,在生产模式下(我创建了一个名为 conf/application.prod.conf 的文件),我将绝对路径设置为它。 所以在我的代码中,我总是使用以下命令作为文件路径(它是用 Java 编写的,但你应该在 Scala 中找到类似的方法来读取配置)

    Play.application().configuration().getString("myapp.image.base")+"img" 
    

    问题 2

    用于提供图像 您需要创建一个路由器。 首先在您的路由文件中添加如下内容:

    GET /user/images/:name controllers.Application.imageAt(name:String)
    

    并在 imageAt 操作中编写一个简单的文件读取器,它返回流中的文件。同样,我的示例是用 Java 编写的,但您应该使用 Scala 归档相同的示例

        File imageFile = new File(ReportFileHelper.getImagePath());
        if (imageFile.exists()) {
        //resource type such as image+png, image+jpg
            String resourceType = "image+"+imageName.substring(imageName.length()-3);
            return ok(new FileInputStream(imageFile)).as(resourceType);
        } else {
            return notFound(imageFile.getAbsoluteFile());
        }
    

    之后,可以从 url/user/images/访问图像

    关于image - Play Framework : Handling dynamic created files (images) in PRODUCTION mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32205870/

    相关文章:

    css - 备用 <div> 可见性(鼠标悬停图像)

    java - 如何在 Play Framework 2 (Java) 中有选择地禁用 CSRF 检查

    PlayFramework 的 Nginx 代理从端口到路径前缀

    database - 如何在 Slick 3.1 中使用不支持的数据库

    python - scipy.misc.imshow 运行时错误 ('Could not execute image view' )

    javascript - Uncaught ReferenceError : $ is not defined

    scala - 何时在 Scala 中使用 Option,何时不使用

    scala - Scala 中的文件路径操作

    javascript - 如何从 Canvas 上加载的切片图像获取图像?

    scala - 不连贯的scala库版本