HTML-Formulare, die Dateidaten übertragen, müssen mit der Methode POST und der Aktion "multipart/form-data" konfiguriert werden. Es gibt
zwei Methoden, mit denen diese Daten empfangen werden können. Dabei akzeptiert die JAX-RS-Ressourcenmethode die Daten mit der JAX-RS-Implementierung
(IBM Java™ API for RESTful Web Services).
Informationen zu diesem Vorgang
Diese Task enthält Anweisungen zur Konfiguration einer JAX-RS-Methode, mit der Sie mehrteilige Formulardaten konsumieren und erzeugen können. Im folgenden Beispiel sehen Sie ein HTML-Formular:
<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 die folgende Ressourcenmethode deklarieren:
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(@FormParam("fileid") int theFileid,
@FormParam("description") String theDescription,
@FormParam("thefile") File theFile) {
// die im Formular enthaltenen Daten zurückmelden
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFile);
op.setContentType(MediaType.TEXT_PLAIN); // oder ein anderer passender Typ, basierend auf der empfangenen Datei
bomp.setLocationHeader("thefile");
bomp.addPart(op);
op = new OutPart();
op.setBody(theDescription);
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("description");
bomp.addPart(op);
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFileid + ""); // falls die Fileid nicht initialisiert wurde
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("fileid");
bomp.addPart(op);
return Response.ok(bomp, "multipart/form-data").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.
- Optional: Wenn die IBM JAX-RS-Implementierung in JAX-RS 1.1 die Nutzdaten des Abschnitts nicht automatisch decodieren soll,
definieren Sie die Annotation @Encoded für den Methodenparameter. Das folgende Beispiel veranschaulicht die Verwendung der Annotation @Encoded im Methodenparameter:
package com.example.jaxrs;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(@FormParam("fileid") int theFileid,
@FormParam("description") String theDescription,
@Encoded @FormParam("thefile") File theFile) {
// Nutzdaten des Dateiabschnitts nicht automatisch decodieren.
...
}
Wenn Sie das Abrufen und Decodieren aller Abschnitte in einer Nachricht
mit mehrteiligen Formulardaten vollständig steuern möchten,
können Sie das Objekt BufferedInMultiPart selbst empfangen:
package com.example.jaxrs;
import org.apache.wink.common.model.multipart.BufferedInMultiPart;
import org.apache.wink.common.model.multipart.InPart;
@POST
@Consumes("multipart/form-data")
@Produces("multipart/form-data")
public Response postFormData(BufferedInMultiPart bimp) {
List<InPart> parts = bimp.getParts();
// Über Abschnitte (parts) iterieren und diese entsprechend verarbeiten
}
Ergebnisse
Sie erhalten Daten aus einer HTTP-POST-Anforderung mit einem Inhaltstyp (Content-Type), der mehrteilige Formulardaten enthält, und melden diese zurück,
indem Sie die IBM JAX-RS-Implementierung die Abschnitte automatisch aufteilen und decodieren lassen. Sie erhalten bestimmte Abschnitte,
die noch immer codiert sind, damit Sie sie selbst verarbeiten können.