Exemple de téléchargement de fichier dans RESTEasy

Pas beaucoup d’exemples complets de téléchargement de fichiers dans JAX-RS, en particulier RESTEasy .

Ici, nous vous montrons deux exemples complets de RESTEasy pour gérer le téléchargement de fichiers à partir d’un formulaire HTML.

  1. Manière normale de gérer le fichier téléchargé via MultipartFormDataInput

  2. Mappez le fichier téléchargé vers une classe POJO via @ MultipartForm

1. Dépendance RESTEasy Multipart

Dans RESTEasy, vous avez besoin de « resteasy-multipart-provider.jar » pour gérer le téléchargement de fichiers en plusieurs parties.

Fichier: pom.xml

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>2.2.1.GA</version>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-multipart-provider</artifactId>
        <version>2.2.0.GA</version>
    </dependency>

    <!-- optional, good for handle I/O task -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.0.1</version>
    </dependency>

2. Formulaire HTML de téléchargement de fichier

Formulaire HTML simple pour télécharger le fichier.

<html>
<body>
    <h1>JAX-RS Upload Form</h1>

    <form action="rest/file/upload" method="post" enctype="multipart/form-data">

       <p>
        Select a file : <input type="file" name="uploadedFile" size="50"/>
       </p>

       <input type="submit" value="Upload It"/>
    </form>

</body>
</html>

3.1 Exemple MultipartFormDataInput

Premier exemple, le fichier téléchargé mappera automatiquement sur « MultipartFormDataInput ».

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import org.apache.commons.io.IOUtils;
import org.jboss.resteasy.plugins.providers.multipart.InputPart;
import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;

@Path("/file")
public class UploadFileService {

    private final String UPLOADED__FILE__PATH = "d:\\";

    @POST
    @Path("/upload")
    @Consumes("multipart/form-data")
    public Response uploadFile(MultipartFormDataInput input) {

        String fileName = "";

        Map<String, List<InputPart>> uploadForm = input.getFormDataMap();
        List<InputPart> inputParts = uploadForm.get("uploadedFile");

        for (InputPart inputPart : inputParts) {

         try {

            MultivaluedMap<String, String> header = inputPart.getHeaders();
            fileName = getFileName(header);

           //convert the uploaded file to inputstream
            InputStream inputStream = inputPart.getBody(InputStream.class,null);

            byte[]bytes = IOUtils.toByteArray(inputStream);

           //constructs upload file path
            fileName = UPLOADED__FILE__PATH + fileName;

            writeFile(bytes,fileName);

            System.out.println("Done");

          } catch (IOException e) {
            e.printStackTrace();
          }

        }

        return Response.status(200)
            .entity("uploadFile is called, Uploaded file name : " + fileName).build();

    }

   /** **
     **  header sample
     **  {
     **   Content-Type=[image/png],
     **   Content-Disposition=[form-data; name="file"; filename="filename.extension"]     **  }
     ** ** /   //get uploaded filename, is there a easy way in RESTEasy?
    private String getFileName(MultivaluedMap<String, String> header) {

        String[]contentDisposition = header.getFirst("Content-Disposition").split(";");

        for (String filename : contentDisposition) {
            if ((filename.trim().startsWith("filename"))) {

                String[]name = filename.split("=");

                String finalFileName = name[1].trim().replaceAll("\"", "");
                return finalFileName;
            }
        }
        return "unknown";
    }

   //save to somewhere
    private void writeFile(byte[]content, String filename) throws IOException {

        File file = new File(filename);

        if (!file.exists()) {
            file.createNewFile();
        }

        FileOutputStream fop = new FileOutputStream(file);

        fop.write(content);
        fop.flush();
        fop.close();

    }
}

Dans cet exemple, si vous sélectionnez un fichier “ c: \\ abc.png ” à partir de votre lecteur C local, cliquez sur le bouton d’envoi, il sera alors chargé sur “ d: \\ abc.png “.

Téléchargez-le - lien://wp-content/uploads/2011/07/JAX-RS-FileUpload-Resteasy-Example1.zip[JAX-RS-FileUpload-Resteasy-Example1.zip](8 Ko)

3.2 Exemple MultipartForm

Cet exemple mappera le fichier téléchargé sur une classe POJO, vous devez donc gérer l’exemple inputPart comme 3.1.

Fichier POJO, mappez le fichier téléchargé vers cette classe.

import javax.ws.rs.FormParam;
import org.jboss.resteasy.annotations.providers.multipart.PartType;

public class FileUploadForm {

    public FileUploadForm() {
    }

    private byte[]data;

    public byte[]getData() {
        return data;
    }

    @FormParam("uploadedFile")
    @PartType("application/octet-stream")
    public void setData(byte[]data) {
        this.data = data;
    }

}

Handle le fichier téléchargé.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;

@Path("/file")
public class UploadFileService {

    @POST
    @Path("/upload")
    @Consumes("multipart/form-data")
    public Response uploadFile(@MultipartForm FileUploadForm form) {

        String fileName = "d:\\anything";

        try {
            writeFile(form.getData(), fileName);
        } catch (IOException e) {

            e.printStackTrace();
        }

        System.out.println("Done");

        return Response.status(200)
            .entity("uploadFile is called, Uploaded file name : " + fileName).build();

    }

   //save to somewhere
    private void writeFile(byte[]content, String filename) throws IOException {

        File file = new File(filename);

        if (!file.exists()) {
            file.createNewFile();
        }

        FileOutputStream fop = new FileOutputStream(file);

        fop.write(content);
        fop.flush();
        fop.close();

    }
}

Le problème est que vous ne pouvez pas obtenir le nom du fichier téléchargé! Pour résoudre ce problème, vous pouvez placer une zone de texte au format HTML afin que l’utilisateur puisse saisir le nom du fichier téléchargé et le mapper sur « FileUploadForm » via «@FormParam (" nom__fichier ")`.

Téléchargez-le - lien://wp-content/uploads/2011/07/JAX-RS-FileUpload-Resteasy-Example2.zip[JAX-RS-FileUpload-Resteasy-Example2.zip](8 Ko)

Conclusion

En règle générale, RESTEasy est capable de gérer plusieurs parties bien, mais il est plutôt difficile d’obtenir les informations d’en-tête du fichier téléchargé, comme le nom de fichier. Ou peut-être que je ne sais pas comment utiliser l’API RESTEasy?

Références

puis-je télécharger un fichier multipart/form avec jax-rs?]. http://stackoverflow.com/questions/4875780/resteasy-multipart-data-form-file-upload-on

chargement de fichier multipart/data-form sur GAE]

lien://tag/fichier-upload/[fichier upload]lien://tag/jax-rs/[jax-rs]lien://tag/resteasy/[resteasy]