Ressource für den Empfang von Abschnitten mit mehrteiligen Formulardaten aus einem HTML-Übergabeformular in JAX-RS 2.0 konfigurieren

HTML-Formulare, die Dateidaten übertragen, müssen mit der Methode POST und der Aktion "multipart/form-data" konfiguriert werden. Diese Daten können auf eine der beiden Arten von der JAX-RS-Ressourcenmethode empfangen werden, die sie mit der JAX-RS-Implementierung ( IBM Java™ API for RESTful Web Services) akzeptiert.

Informationen zu dieser Task

Diese Task enthält Anweisungen zur Konfiguration einer JAX-RS-Methode, mit der Sie Abschnitte mit mehrteiligen Formulardaten ("multipart/form-data") verwenden und erzeugen können. Im folgenden Beispiel wird ein HTML-Formular gezeigt:
<form action="http://www.example.com/" method="POST" enctype="multipart/form-data">
    <input type="text" name="fileid" />
    <br />
    <input type="text" name="description" />
    <br />
    <input type="file" name="thefile" />
    <br />
    <input type="submit" name="submit" value="submit"/>
</form>
Sie können IBM JAX-RS implementieren, um die Daten in Abschnitten zu empfangen, die Sie dann, falls erforderlich, selbst verarbeiten können.

Vorgehensweise

Erstellen Sie eine Ressourcenmethode.
Damit Inhalt mit mehrteiligen Formulardaten aus einer HTTP-POST-Anforderung empfangen und zurückgemeldet werden kann, müssen Sie eine der folgenden Ressourcenmethoden deklarieren:


@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")

public Response postFormData(IMultipartBody multipartBody) {
  List <IAttachment> attachments = multipartBody.getAllAttachments();
         String formElementValue = null; 
         InputStream stream = null;
         for (Iterator<IAttachment> it = attachments.iterator(); it.hasNext();) {
              IAttachment attachment = it.next();
              if (attachment == null) {
                  continue;
              }
              DataHandler dataHandler = attachment.getDataHandler();
              stream = dataHandler.getInputStream();
              MultivaluedMap<String, String> map = attachment.getHeaders();
              String fileName = null;
              String formElementName = null;
              String[] contentDisposition = map.getFirst("Content-Disposition").split(";");
              for (String tempName : contentDisposition) {
                  String[] names = tempName.split("=");
                  formElementName = names[1].trim().replaceAll("\"", "");
                  if ((tempName.trim().startsWith("filename"))) {
                      fileName = formElementName;
                  }
              }
              if (fileName == null) {
                  StringBuffer sb = new StringBuffer();
                  BufferedReader br = new BufferedReader(new InputStreamReader(stream));
                  String line = null;
                  try {
                      while ((line = br.readLine()) != null) {
                          sb.append(line);
                      }
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                      if (br != null) {
                          try {
                              br.close();
                          } catch (IOException e) {
                              e.printStackTrace();
                          }
                      }
                  }
                  formElementValue = sb.toString();
                  System.out.println(formElementName + ":" + formElementValue);
              } else {
               //handle the file as you want
               File tempFile = new File(fileName);
               ...
              }
         }
         if (stream != null) {
             stream.close();
         }
         return Response.ok("test").build();
}
Oder


@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")

public Response postFormData(List<IAttachment>attachments) {
  List <IAttachment> attachments = multipartBody.getAllAttachments();
         String formElementValue = null; 
         InputStream stream = null;
         for (Iterator<IAttachment> it = attachments.iterator(); it.hasNext();) {
              IAttachment attachment = it.next();
              if (attachment == null) {
                  continue;
              }
              DataHandler dataHandler = attachment.getDataHandler();
              stream = dataHandler.getInputStream();
              MultivaluedMap<String, String> map = attachment.getHeaders();
              String fileName = null;
              String formElementName = null;
              String[] contentDisposition = map.getFirst("Content-Disposition").split(";");
              for (String tempName : contentDisposition) {
                  String[] names = tempName.split("=");
                  formElementName = names[1].trim().replaceAll("\"", "");
                  if ((tempName.trim().startsWith("filename"))) {
                      fileName = formElementName;
                  }
              }
              if (fileName == null) {
                  StringBuffer sb = new StringBuffer();
                  BufferedReader br = new BufferedReader(new InputStreamReader(stream));
                  String line = null;
                  try {
                      while ((line = br.readLine()) != null) {
                          sb.append(line);
                      }
                  } catch (IOException e) {
                      e.printStackTrace();
                  } finally {
                      if (br != null) {
                          try {
                              br.close();
                          } catch (IOException e) {
                              e.printStackTrace();
                          }
                      }
                  }
                  formElementValue = sb.toString();
                  System.out.println(formElementName + ":" + formElementValue);
              } else {
               //handle the file as you want
               File tempFile = new File(fileName);
               ...
              }
         }
         if (stream != null) {
             stream.close();
         }
         return Response.ok("test").build();
}
Der Absender des POST-Übergabeformulars kann einen Content-Transfer-Encoding-Header für einen oder mehrere Abschnitte der mehrteiligen Nachricht generieren. Die IBM JAX-RS-Implementierung versucht automatisch, die Nutzdaten des Abschnitts, der diesem Header entspricht, zu decodieren, wenn der Header den Codierungstyp base64 oder quoted-printable hat.

Ergebnisse

Sie haben Daten aus einer HTTP-POST-Anforderung mit einem Inhaltstyp (Content-Type), der mehrteilige Formulardaten enthält, erhalten und zurückgemeldet. Dazu haben Sie die IBM JAX-RS-Implementierung die Abschnitte automatisch aufteilen und decodieren lassen. Sie haben bestimmte Abschnitte erhalten, die noch immer codiert sind, damit Sie sie selbst verarbeiten können.