2

コントローラに次の基本的なアクション(説明のため)があり、MultipartFormDataオブジェクトが渡され、画像とファイル名が取得されます。nullでない場合は、ファイル名をsbtコンソールに出力し(実行します)、play 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();
}

ドキュメントが見つからないのは、このファイルを実際にplayプロジェクトのパブリックフォルダーに移動する方法です。私はスカラの人が機能を持っていることに気づきました

ref.moveTo()

似たような質問が少なくとも2つから3つあることは知っていますが、それらはファイルをプロジェクトディレクトリに移動する方法を説明していません。ここでは基本的に非常に単純なものが欠けていますが、ネット上のどこにも文書化されていません。

4

2 に答える 2

7

さらに詳しく調べてみると、playは最初に、アップロードされた画像を、私の場合はであったシステム固有の一時ディレクトリに保存することがわかりました/tmp/

私のLinuxシステムは3つのパーティションでセットアップされています:-

/boot
/
/home

Playのインストールはパーティション上にあり、存在する場所/homeから論理的に分離されています。この場合、パーティションは個別のファイルシステムとして扱われます。/tmp

javadocの状態:-

名前変更操作では、ファイルをあるファイルシステムから別のファイルシステムに移動できない場合があります

つまり、システムによっては、File.renameTo()2つの異なるパーティション、ディスク、またはファイルシステム間で動作しない可能性があります。.renameTo()これが失敗した理由です。

解決:-

ApacheCommonsioを使用する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"
)

PlayConsoleで使用します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();
}
于 2013-03-01T05:12:53.487 に答える
1

(ファイルシステムへの)絶対パスの代わりに相対パスを使用する

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