Saltar al contenido

Intentando cargar un archivo en un servidor JAX-RS (jersey)

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *