8 votes

Comment télécharger plusieurs fichiers à l'aide de play framework ?

J'utilise play framework 2.1.2 en utilisant java et je suis en train de créer une vue pour télécharger plusieurs fichiers et mon code est ici :

@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"> 

            }

Je veux télécharger seulement fichier doc et pdf .

comment limiter le formulaire à l'envoi de fichiers doc et pdf ?

Je peux le faire avec java mais je cherche un code html.

Après cela, je veux stocker plusieurs fichiers dans mon ordinateur de façon permanente.

et imprimer le nom du fichier que j'ai téléchargé.

mon code :

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());
 }

c'est stockage du fichier dans le répertoire temporaire mais je veux stocker à l'emplacement permanent et non dans le répertoire temporaire comme un fichier et non un fichier temporaire comme si je téléchargeais a.docx je veux stocker ce fichier dans le stockage con a.docx nom.

Je ne veux pas stocker le fichier dans la base de données.

et comment lister tous les fichiers que j'ai téléchargés par nom de fichier ?

J'ai trouvé quelques questions mais je n'ai pas obtenu de réponses parce que ces questions concernent une ancienne version.

donnez-moi une idée pour résoudre ce problème.

7voto

cYn Points 585

Voici comment j'ai mis en œuvre le mien. Je m'excuse si j'ai fait des erreurs quelque part. Je l'ai "remanié" pour qu'il ne ressemble pas du tout à mon code de production.

En HTML, j'ai :

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

Dans mon contrôleur, j'ai :

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();
}

Comme Kris l'a dit, vous devrez obtenir le CommonIO d'Apache.

Vous pouvez facilement le faire en ajoutant ceci dans votre Build.scala qui se trouve dans /PlayProject/projet :

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
  )
}

Dans cette implémentation, vous pouvez stocker les fichiers n'importe où sur votre ordinateur, à l'endroit que vous avez spécifié dans l'option File newFile1 . Mais vous devrez utiliser une base de données si vous voulez lister vos fichiers. Mais il suffit de stocker le chemin d'accès au fichier sous forme de chaîne (varchar) dans la base de données. Je vous laisse le soin de résoudre cette partie car je ne sais pas comment vous voulez gérer la récupération des fichiers.

Vous pouvez restreindre l'utilisateur à télécharger uniquement certains types de fichiers en utilisant Javascript. Demandez à Javascript de valider le formulaire en vérifiant le nom du fichier : voici un exemple :

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

J'espère que tout cela vous aidera.

4voto

Kris Points 3826

Pour obtenir votre fichier ailleurs qu'à l'emplacement temporaire, vous devez le copier, le mieux étant d'utiliser quelque chose comme FileUtils de Apache Commons ( http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils.html )

Quant aux noms de fichiers, vous pouvez les obtenir à partir de MultipartFormData.

1voto

Nilanjan Points 741

Une solution pourrait être d'utiliser un analyseur de corps personnalisé qui peut prendre un répertoire spécifié et y enregistrer les fichiers téléchargés. Mais vous devez ajouter du code Scala au projet. Voici le gist :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X