gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 14:44:17 25 4
gpt4 key购买 nike

我试图允许用户将照片上传到服务器,然后在生产(而非开发)中查看它们(所有用户都可以查看所有照片)。在开发模式下,一切都很简单 - 我可以将文件上传到公共(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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com