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 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:
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 {
//Die Datei nach Bedarf verarbeiten
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 {
//Die Datei nach Bedarf verarbeiten
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.