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 文件

如何限制表单仅上传 doc 和 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

  • 第一个 getFiles()方法
  • 第二个getFile():文件方法
于 2013-08-26T10:17:08.840 回答
1

一种方法是使用自定义正文解析器,该解析器可以获取指定目录并将上传的文件保存在那里。但是您必须在项目中添加一些 Scala 代码。这是要点:

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

于 2013-08-27T05:14:38.730 回答