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. 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 Aufgabe enthält Anweisungen für die Konfiguration einer JAX-RS-Methode für die Verwendung und Erzeugung mehrteiliger Formulardaten.
Das folgende Beispiel zeigt 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, sodass Sie diese Abschnitte bei Bedarf selbst verarbeiten können. Vorgehensweise
Erstellen Sie eine Ressourcenmethode. Sie müssen eine der folgenden Ressourcenmethoden deklarieren, um Inhalt mit mehrteiligen Formulardaten
aus einer HTTP-POST-Anforderung zu empfangen und zurückzumelden:
package com.example.jaxrs;
@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 {
// Datei wie gewünscht bearbeiten
File tempFile = new File(fileName);
...
}
}
if (stream != null) {
stream.close();
}
return Response.ok("test").build();
}
Oder
package com.example.jaxrs;
@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 {
// Datei wie gewünscht bearbeiten
File tempFile = new File(fileName);
...
}
}
if (stream != null) {
stream.close();
}
return Response.ok("test").build();
}
Der Absender des POST-Übergabeformulars kann einen Header "Content-Transfer-Encoding"
für einen oder mehrere Abschnitte der mehrteiligen Nachricht generieren. Die IBM JAX-RS-Implementierung versucht,
die Nutzdaten des Abschnitts, der diesem Header entspricht, automatisch zu decodieren, wenn der Header den
Codierungstyp base64 oder quoted-printable hat. Ergebnisse
Sie haben Daten aus einer HTTP-POST-Anforderung mit dem Inhaltstyp "multipart/form-data" empfangen und zurückgemeldet. Dazu haben Sie die IBM JAX-RS-Implementierung die Abschnitte automatisch aufteilen und decodieren lassen. Sie haben bestimmte Abschnitte empfangen, die noch immer codiert sind, um diese selbst zu verarbeiten.