2012-05-15 21 views
6

Mi código para el archivo REST carga:HTTP 415 en el archivo de carga utilizando el jersey

@Path("/upload") 
@POST 
@Consumes("multipart/form-data") 
public String post(
    @FormDataParam("part") String s, 
    @FormDataParam("part") FormDataContentDisposition d) { 
    return s + ":" + d.getFileName(); 
} 

Cuando intento cargar un archivo usando rizo rizo -X POSTAL --form url [email protected]

me estoy haciendo un HTTP 415-no compatible Tipo de soporte error. Qué está mal ?

Respuesta

5

Después de probar una gran cantidad de ejemplos finaly encontrar el ejemplo realmente trabajando en http://iambigd.blogspot.com/2011/06/java-upload-file-using-jersey.html

@POST 
@Path("/simpleupload") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public void simpleUpload(
    //@Context UriInfo ui, 
    @Context HttpServletRequest request 
){ 
    String fileRepository = "D:\\"; 
    if (ServletFileUpload.isMultipartContent(request)) { 
    FileItemFactory factory = new DiskFileItemFactory(); 
    ServletFileUpload upload = new ServletFileUpload(factory); 
    List<FileItem> items = null; 
    try { 
     items = upload.parseRequest(request); 
    } catch (FileUploadException e) { 
     e.printStackTrace(); 
    } 
    if (items != null) { 
     Iterator<FileItem> iter = items.iterator(); 
     while (iter.hasNext()) { 
      FileItem item = iter.next(); 
      if (!item.isFormField() && item.getSize() > 0) { 
      System.out.println("File is found."); 
      String fileName = processFileName(item.getName()); 
      try { 
       String savePath = fileRepository + fileName; 
       System.out.println("savePath:" + savePath); 
       item.write(new File(savePath)); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     }else{ 
      System.out.println("getFieldName:" + item.getFieldName()); 
      System.out.println(item.getString()); 
     } 
    } 
    } 
} 
} 

(necesita el servlet-api.jar,() Commons Apache (Apache) Commons-oi.jar y -fileupload.jar)

0

¿Has probado con un flujo de entrada?

Como:

@POST 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response post(
     @Context HttpServletRequest request, 
     @Context HttpHeaders headers, 
     @FormDataParam("file") InputStream fileStream, 

funciona bien para mí.

5

Esto puede suceder debido a un par de razones. Logré reducir algunos de ellos.

  1. Su cabecera Content-Type no coincide con la proporcionada por la cabecera @Consumes. Verifica esto con un proxy.

  2. Logró toparse con a bug que se solucionó en Jersey 1.4 relacionado con la anotación FormDataParam.

  3. Ha incluido el jersey de haz y Jersey-servidor y todos en el mismo binario y que están compitiendo uno contra el otro.

  4. está usando el @FormParam en lugar de @FormDataParam.

  5. La API de introspección no reconoce a su @FormDataParam debido a conflictos con jersey-multipart y otros frascos de jersey. Si un jar es de la versión 1.x asegúrese de que los otros jar estén en la misma versión. Al depurar el código API de jersey noté que estas anotaciones de método aparecen en blanco (en el código de jersey) si las versiones de jar no son uniformes. Todos los parámetros del método en el servicio REST se reemplazan por el contenido del cuerpo de la solicitud POST, independientemente de qué FormDataParam se supone que contienen.

1

por favor asegúrese de que tiene mimepull.jar en la ruta de clase

1

Es posible que necesite registrar el MultipartFeature como se describe en la documentación Jersey, capítulo 8.3.1.2 Registration.

Crear una clase algo como esto:

/** 
* 
*/ 
package com.verico.multipart.app; 

import javax.ws.rs.ApplicationPath; 

import org.glassfish.jersey.media.multipart.MultiPartFeature; 
import org.glassfish.jersey.server.ResourceConfig; 

@ApplicationPath("/") 
public class MultiPartApp extends ResourceConfig { 

public MultiPartApp() { 
    super(MultiPartFeature.class); 
    } 
} 

y agregue el siguiente init-param a su servlet Jersey en web.xml:

 <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.verico.multipart.app.MultiPartApp</param-value> 
    </init-param> 
Cuestiones relacionadas