Os formulários HTML que transmitem dados do arquivo devem ser configurados com o método
POST e a ação "multipart/form-data". Esses dados podem ser recebidos de uma de duas formas
pelo método de recurso JAX-RS que aceita-o com a implementação
do IBM Java™ API
para RESTful Web Services (JAX-RS).
Sobre Esta Tarefa
Esta tarefa fornece instruções para configurar o método JAX-RS
para consumir e produzir multipart/form-data. O exemplo a seguir ilustra um
formulário 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>
É possível implementar o IBM JAX-RS para receber
dados em partes, para que você próprio possa processar essas partes, se necessário.
Procedimento
- Crie o método de recurso. Deve-se declarar o
método de recurso a seguir para receber e repetir conteúdo dados de formulário/partes múltiplas
de um 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) {
// echo what we got in the form
BufferedOutMultiPart bomp = new BufferedOutMultiPart();
OutPart op = new OutPart();
op.setBody(theFile);
op.setContentType(MediaType.TEXT_PLAIN); // or other appropriate type, based on the file you received
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 + ""); // just in case theFileid is uninitialized
op.setContentType(MediaType.TEXT_PLAIN);
bomp.setLocationHeader("fileid");
bomp.addPart(op);
return Response.ok(bomp, "multipart/form-data").build();
}
O envio POST do formulário pode gerar um cabeçalho
Conteúdo-Transferência-Codificação para uma ou mais partes da mensagem
multipartes. A implementação IBM JAX-RS tenta decodificar automaticamente a
carga útil da parte de acordo com este cabeçalho quando o cabeçalho é do tipo de codificação base64 ou quoted-printable.
- Opcional: Para JAX-RS 1.1, se você não desejar
que a implementação do IBM JAX-RS decodifique automaticamente a carga útil da parte, coloque
a anotação @Encoded no parâmetro do método. O seguinte exemplo ilustra o uso da anotação
@Encoded no parâmetro de 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) {
// don't auto-decode the file part payload
...
}
Se desejar ter o controle total da recuperação
e decodificar todas as partes em uma mensagem multipart/form-data,
poderá receber o próprio 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();
// iterate over the "parts" and process them however you like
}
Resultados
Você recebeu e repetiu dados de um POST HTTP com o tipo de conteúdo
dados de formulário/partes múltiplas, permitindo que a implementação do IBM JAX-RS
divida e decodifique automaticamente as partes e recebendo as partes ainda
codificadas para você processar.