8

私はplay framework 2.1.2 javaを使用しており、複数のファイルをアップロードするビューを作成しています。私のコードは次のとおりです:

@form(action = routes.upload.up, 'enctype -> "multipart/form-data") {
            <input type="file" name="picture" accept="application/pdf" multiple="multiple"><br/> 
            <input type="submit" value="upload"> 

            }

doc と pdf ファイルのみをアップロードしたい。

ドキュメントとPDFファイルのみをアップロードするようにフォームを制限する方法は?

私はJavaでこれを行うことができますが、htmlコードを探しています.

この後、複数のファイルをコンピューターの永続的なストレージに保存したいと考えています。

アップロードしたファイルの名前を印刷します。

私のコード:

public static Result up(){


MultipartFormData md=request().body().asMultipartFormData();

        List<FilePart>file;

        file=md.getFiles();

        for(FilePart p: file){
        Logger.info(p.getFilename());
        }

        return ok(file.get(0).getFilename());
 }

ファイルを一時ディレクトリに保存していますが、アップロードする場合のように一時ファイルではなく、一時ディレクトリではなく永続的な場所に保存したいのですが、このファイルを名前付きのストレージに保存しa.docxたいのです。a.docx

ファイルをデータベースに保存したくありません。

ファイル名でアップロードしたすべてのファイルを一覧表示する方法は?

いくつかの質問を見つけましたが、その質問は古いバージョンのものであるため、その回答が得られません。

この問題を解決するためのアイデアを教えてください。

4

3 に答える 3

7

これが私の実装方法です。どこかで間違いがありましたら申し訳ありません。私はそれを「リファクタリング」して、私の製品コードのようには見えないようにしました。

HTMLには次のものがあります:

<form name="fileUploadForm" method="POST" enctype="multipart/form-data" action="@routes.Application.upload()">
        File 1: <br /> <input type="file" name="filePart1" id="filePart1"><br />
        File 2: <br /> <input type="file" name="filePart2" id="filePart1"><br />
</form>

私のコントローラーには次のものがあります:

public static Result upload() {
    MultipartFormData body = request().body().asMultipartFormData();

    FilePart filePart1 = body.getFile("filePart1");
    FilePart filePart2 = body.getFile("filePart2");

    File newFile1 = new File("path in computer");
    File newFile2 = new File("path in computer");

    File file1 = filePart1.getFile();
    File file2 = filePart2.getFile();

    InputStream isFile1 = new FileInputStream(file1);
    InputStream isFile2 = new FileInputStream(file2);

    byte[] byteFile1 = IOUtils.toByteArray(isFile1);
    byte[] byteFile2 = IOUtils.toByteArray(isFile2);

    FileUtils.writeByteArrayToFile(newFile1, byteFile1);
    FileUtils.writeByteArrayToFile(newFile2, byteFile2);

    isFile1.close();
    isFile2.close();
}

Kris が言ったように、Apache の CommonIO を取得する必要があります。

/PlayProject/project にある Build.scala にこれを追加することで、これを簡単に実行できます。

import sbt._
import Keys._
import play.Project._
import com.typesafe.config._

object ApplicationBuild extends Build {
  val appDependencies = Seq(
    "commons-io" % "commons-io" % "2.4"  //add this here
  )
}

この実装では、 で指定したコンピュータ上の任意の場所にファイルを保存できますFile newFile1。ただし、ファイルを一覧表示する場合は、データベースを使用する必要があります。ただし、ファイル パスを文字列 (varchar) としてデータベースに格納するだけで済みます。ファイルの取得をどのように処理したいのかわからないので、その部分はあなたに任せます。

Javascript を使用して、ユーザーが特定の種類のファイルのみをアップロードするように制限できます。ファイル名をチェックして、Javascript にフォームの検証を行わせる: 以下に例を示します。

<script>
    var file1 = document.getElementById("filePart1").value;
    if (file1.indexOf(".pdf") == -1) {
        alert("Not a PDF file!");
    else {
        document.fileUploadForm.submit();
    }
</script>

それがすべて役立つことを願っています。

于 2013-08-26T20:43:12.797 に答える
4

ファイルをコピーする必要がある一時的な場所以外の場所にファイルを取得するには、Apache Commons の FileUtils などを使用するのが最適です ( http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io /FileUtils.html )

ファイル名については、MultipartFormData から取得できます

于 2013-08-26T10:17:08.840 に答える
1

1 つの方法は、指定されたディレクトリを取り、そこにアップロードされたファイルを保存できるカスタム ボディ パーサーを使用することです。ただし、いくつかの Scala コードをプロジェクトに追加する必要があります。要点は次のとおりです。

https://gist.github.com/nraychaudhuri/6349808

于 2013-08-27T05:14:38.730 に答える