Los formularios HTML que transmiten datos de archivo, deben
configurarse
con el método POST y la acción "multipart/form-data". Estos datos los puede recibir de dos formas distintas el método de recursos JAX-RS que los acepta con la implementación IBM Java™ API for RESTful Web Services (JAX-RS).
Acerca de esta tarea
Esta tarea proporciona instrucciones para configurar un método
JAX-RS para consumir y producir multipart/form-data. En el ejemplo
siguiente se muestra un formulario HTML:
<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>
Puede implementar IBM JAX-RS para
recibir los datos en partes, de modo que pueda procesar estas partes por su cuenta, si es necesario.
Procedimiento
- Cree un método de recursos. Debe declarar el método de recurso siguiente para recibir y repetir los datos de varias partes/formulario de un HTTP POST:
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) {
// repetir lo que hay en el formulario
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFile);
op.setContentType(MediaType.TEXT_PLAIN); // u otro tipo apropiado, basado en el archivo recibido
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 + ""); // en caso de que theFileid no se haya inicializado
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("fileid");
bomp.addPart(op);
return Response.ok(bomp, "multipart/form-data").build();
}
El originador del envío de form POST puede generar una cabecera
content-transfer-encoding para una o varias partes del mensaje de varias partes. La implementación de IBM JAX-RS intenta decodificar automáticamente la carga útil de la parte de acuerdo con esta cabecera cuando la cabecera tiene el tipo de codificación base64 o quoted-printable.
- Opcional: En JAX-RS 1.1, si no desea que la implementación de IBM JAX-RS
decodifique automáticamente la parte de carga útil, coloque la anotación
@Encoded en el parámetro del método. En el ejemplo siguiente se muestra el uso de la anotación
@Encoded en el parámetro del método:
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) {
// no decodificar automáticamente la parte de carga útil del archivo
...
}
Si desea tener el control completo de la recuperación
y decodificación de todas las partes de un mensaje multipart/form-data, puede recibir el
propio objeto BufferedInMultiPart: 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();
// repetir en las "partes" y procesarlas como se desee
}
Resultados
Recibirá y repetirá datos de un POST HTTP con contenido de datos varias partes/formulario de dos formas distintas: permitiendo a la implementación IBM JAX-RS dividir y decodificar automáticamente las partes y recibiendo las partes todavía codificadas para procesarlas usted mismo.