Bienvenido a nuestra página, en este sitio vas a hallar la resolución de lo que andabas buscando.
Solución:
Si desea agregar cadenas a la FormDataMultiPart
solo usa el .field("name", "value")
método de la misma manera que se utiliza para el archivo adjunto (queryParam no funciona).
A continuación se muestra una muestra de trabajo:
Primero, la parte del servidor que devuelve el contenido del archivo leído como una cadena:
@Path("file")
public class FileResource
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response handleUpload(@FormDataParam("file") InputStream stream) throws Exception
return Response.ok(IOUtils.toString(stream)).build();
En segundo lugar, el método del cliente que publica el archivo:
public void upload(String url, String fileName)
InputStream stream = getClass().getClassLoader().getResourceAsStream(fileName);
FormDataMultiPart part = new FormDataMultiPart().field("file", stream, MediaType.TEXT_PLAIN_TYPE);
WebResource resource = Client.create().resource(url);
String response = resource.type(MediaType.MULTIPART_FORM_DATA_TYPE).post(String.class, part);
assertEquals("Hello, World", response);
En tercer lugar, el entorno de prueba:
Server server;
@Before
public void before() throws Exception
server = new Server(8080);
server.addHandler(new WebAppContext(WEB_INF_DIRECTORY, "/"));
server.start();
@After
public void after() throws Exception
server.stop();
@Test
public void upload()
upload("http://localhost:8080/file", "file.txt");
Finalmente, las dependencias maven:
junit
junit
4.8.2
test
com.sun.jersey
jersey-server
1.6
com.sun.jersey
jersey-client
1.6
com.sun.jersey.contribs
jersey-multipart
1.6
org.mortbay.jetty
jetty-embedded
6.1.26
commons-io
commons-io
2.0.1
los file.txt
está en la raíz del classpath y contiene Hello, World
.
La solución de Yves no funcionó para mí en el lado del cliente. Miré un poco alrededor y encontré:
- http://puspendu.wordpress.com/2012/08/23/restful-webservice-file-upload-with-jersey/
- http://neopatel.blogspot.de/2011/04/jersey-posting-multipart-data.html
- http://www.mkyong.com/webservices/jax-rs/file-upload-example-in-jersey/
ninguno de los cuales funcionaría con mi camiseta actual 1.18 (ver el extracto de pom a continuación). La mayoría de los problemas estaban del lado del cliente. Recibiría mensajes de error como:
com.sun.jersey.api.client.ClientHandlerException: javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException: Missing body part entity of type 'text/plain'
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:155)
at com.sun.jersey.api.client.Client.handle(Client.java:652)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
El lado del servidor funcionó rápidamente con este código (que aún no hace nada interesante con el InputStream cargado, se ajusta a sus necesidades)
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("text/plain")
public Response uploadFile(
@FormDataParam("content") final InputStream uploadedInputStream,
@FormDataParam("fileName") String fileName) throws IOException
String uploadContent=IOUtils.toString(uploadedInputStream);
return Response.ok(uploadContent).build();
el lado del cliente funcionaría con este código:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.ws.rs.core.MediaType;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.multipart.FormDataBodyPart;
import com.sun.jersey.multipart.FormDataMultiPart;
/**
* upload the given file
*
* inspired by
* http://neopatel.blogspot.de/2011/04/jersey-posting-multipart-data.html
*
* @param url
* @param uploadFile
* @return the result
* @throws IOException
*/
public String upload(String url, File uploadFile) throws IOException
WebResource resource = Client.create().resource(url);
FormDataMultiPart form = new FormDataMultiPart();
form.field("fileName", uploadFile.getName());
FormDataBodyPart fdp = new FormDataBodyPart("content",
new FileInputStream(uploadFile),
MediaType.APPLICATION_OCTET_STREAM_TYPE);
form.bodyPart(fdp);
String response = resource.type(MediaType.MULTIPART_FORM_DATA).post(String.class, form);
return response;
extracto de pom.xml:
1.18
com.sun.jersey
jersey-server
$jersey.version
com.sun.jersey
jersey-client
$jersey.version
com.sun.jersey.contribs
jersey-multipart
$jersey.version
Más adelante puedes encontrar las reseñas de otros sys admins, tú aún tienes la libertad de dejar el tuyo si lo deseas.