玩! 2.1 Java的完整的基本的文件上传解决方案?(Play! 2.1 Java compl

2019-08-17 05:31发布

我在我的控制器传递一个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层类似于其他的问题,但他们没有说明如何将文件移动到项目目录。 我失去了一些东西从根本上很简单,但在这里我找不到它的任何地方记录在网上。

Answer 1:

在进一步检查事实证明,游戏首次将上传图像到系统特定的临时目录,在我的案件是/tmp/

我的Linux系统设置与三个分区: -

/boot
/
/home

该剧安装位于/home分区,从逻辑上分离/哪里tmp所在。 在这种情况下,分区被视为独立的文件系统。

javadoc的规定: -

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

也就是说,根据不同的系统有一个机会, File.renameTo()可能无法在两个不同的分区,磁盘或文件系统操作。 这是一个原因.renameTo()是失败。

解:-

使用Apache公地IO FileUtils.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

如果使用IDEA play 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();
}


Answer 2:

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

file.renameTo(new File("public/images/products", fileName));


文章来源: Play! 2.1 Java complete basic file upload solution?