2

我的控制器中有以下基本操作(用于说明目的),它传递了一个 MultipartFormData 对象并检索图像和文件名。如果不为空,则将文件名打印到 sbt 控制台(它确实如此),然后根据播放http://www.playframework.com/documentation/2.1.0/JavaFileUpload文档希望将其保存到文件中指定的目录。 renameTo(女巫不是)。

public static Result uploadProductImage(
        Http.MultipartFormData body
) {
    Http.MultipartFormData.FilePart image = body.getFile("image");

    if (image != null) {
        String fileName = image.getFilename();
        System.out.println(fileName);
        File file = image.getFile();
        file.renameTo(new File("/public/images/products", fileName));
    }
    return products();
}

我找不到任何文档的部分是您如何将此文件实际移动到播放项目的公共文件夹中。我注意到斯卡拉家伙有这个功能

ref.moveTo()

我知道至少有 2 到 3 个其他类似的问题,但它们没有描述如何将文件移动到项目目录。我在这里遗漏了一些基本上非常简单的东西,但我在网上的任何地方都找不到它的记录。

4

2 回答 2

7

经过进一步检查,事实证明 play 首先将上传的图像保存到系统特定的临时目录中,在我的情况下是/tmp/.

我的 linux 系统设置了三个分区:-

/boot
/
/home

play 安装位于分区上,逻辑上与所在位置/home分开。在这种情况下,分区被视为单独的文件系统。/tmp

javadoc 状态:-

重命名操作可能无法将文件从一个文件系统移动到另一个文件系统

这意味着根据系统的不同,File.renameTo()可能无法跨两个不同的分区、磁盘或文件系统运行。这就是.renameTo()失败的原因。

解决方案:-

使用 apache commons ioFileUtils.moveFile()

Build.scala添加"org.apache.directory.studio" % "org.apache.commons.io" % "2.4"

val appDependencies = Seq(
    javaCore, jdbc, javaJdbc, javaEbean,
    "org.apache.directory.studio" % "org.apache.commons.io" % "2.4"
)

在游戏控制台中使用play clean compile.

如果使用 IDEAplay idea

public static Result uploadProductImage(
        Http.MultipartFormData body
) {
    Http.MultipartFormData.FilePart image = body.getFile("image");

    if (image != null) {
        String fileName = image.getFilename();
        File file = image.getFile();
        try {
            FileUtils.moveFile(file, new File("public/images/products", fileName));
        } catch (IOException ioe) {
            System.out.println("Problem operating on filesystem");
        }
    }
    return products();
}
于 2013-03-01T05:12:53.487 回答
1

使用相对路径而不是绝对路径(到文件系统)

file.renameTo(new File("public/images/products", fileName));
于 2013-02-28T13:17:53.887 回答