Beispiel für das Hochladen von Dateien in RESTEasy

Beispielhaftes Beispiel für das vollständige Hochladen von Dateien in JAX-RS, insbesondere RESTEasy

Hier zeigen wir Ihnen zwei vollständige RESTEasy-Beispiele für das Hochladen von Dateien aus einem HTML-Formular.

  1. Normalerweise können hochgeladene Dateien über MultipartFormDataInput verarbeitet werden

  2. Hochgeladene Datei über @ MultipartForm in eine POJO-Klasse aufnehmen

1. RESTEasy Multipart Abhängigkeit

In RESTEasy benötigen Sie " resteasy-multipart-provider.jar ", um das Hochladen von mehrteiligen Dateien durchzuführen.

Datei: 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. Datei-Upload-HTML-Formular

Einfaches HTML-Formular zum Hochladen der Datei.

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

Im ersten Beispiel wird die hochgeladene Datei automatisch " MultipartFormDataInput " zugeordnet.

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

    }
}

Wenn Sie in diesem Beispiel eine Datei " c: \\ abc.png " von Ihrem lokalen Laufwerk C auswählen, klicken Sie auf die Schaltfläche "Abschicken". Dann wird sie in " d: \\ abc.png " hochgeladen.

3.2 MultipartForm-Beispiel

In diesem Beispiel wird die hochgeladene Datei einer POJO-Klasse zugeordnet. Sie müssen also das inputPart wie in 3.1 behandeln.

POJO-Datei, zugeordnete Datei dieser Klasse zuordnen.

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 die hochgeladene Datei.

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

    }
}

Das Problem ist, dass Sie den hochgeladenen Dateinamen nicht erhalten können! Um dies zu beheben, können Sie ein Textfeld in ein HTML-Formular einfügen, sodass der Benutzer den hochgeladenen Dateinamen eingeben und über @FormParam ("Dateiname") `" FileUploadForm "zuordnen kann.

Schlussfolgerung

Insgesamt ist RESTEasy in der Lage, mit Multipart gut umzugehen, es ist jedoch ziemlich schwierig, die hochgeladenen Dateiheaderinformationen wie Dateiname zu erhalten. Oder weiß ich vielleicht nicht, wie ich die RESTEasy-API verwenden soll?

Referenzen

Hochladen von Dateien mit mehreren Formaten/Datenformaten auf GAE

Link://Tag/Datei-Upload/[Dateiupload]Link://Tag/Jax-rs/[Jax-Rs] resteasy