玩!2.1 Java完成基本文件上传解决方案?

Ben*_*n B 2 playframework-2.0

我在我的控制器中有以下基本操作(用于说明目的),它传递一个MultipartFormData对象并检索图像和文件名.如果不为null则将文件名打印到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();
}
Run Code Online (Sandbox Code Playgroud)

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

ref.moveTo()
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*n B 7

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

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

/boot
/
/home
Run Code Online (Sandbox Code Playgroud)

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

javadoc说: -

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

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

解:-

使用apache commons 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"
)
Run Code Online (Sandbox Code Playgroud)

在播放控制台中使用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();
}
Run Code Online (Sandbox Code Playgroud)