2011-11-16 24 views
7

Hola, quería devolver un archivo desde un servidor resteasy. Para este propósito, tengo un enlace en el lado del cliente que está llamando a un servicio de descanso con ajax. Quiero devolver el archivo en el servicio de descanso. Probé estos dos bloques de código, pero ninguno funcionó como yo quería.Archivo de devolución del servidor Resteasy

@POST 
    @Path("/exportContacts") 
    public Response exportContacts(@Context HttpServletRequest request, @QueryParam("alt") String alt) throws IOException { 

      String sb = "Sedat BaSAR"; 
      byte[] outputByte = sb.getBytes(); 


    return Response 
      .ok(outputByte, MediaType.APPLICATION_OCTET_STREAM) 
      .header("content-disposition","attachment; filename = temp.csv") 
      .build(); 
    } 

.

@POST 
@Path("/exportContacts") 
public Response exportContacts(@Context HttpServletRequest request, @Context HttpServletResponse response, @QueryParam("alt") String alt) throws IOException { 

    response.setContentType("application/octet-stream"); 
    response.setHeader("Content-Disposition", "attachment;filename=temp.csv"); 
    ServletOutputStream out = response.getOutputStream(); 
    try { 

     StringBuilder sb = new StringBuilder("Sedat BaSAR"); 

     InputStream in = 
       new ByteArrayInputStream(sb.toString().getBytes("UTF-8")); 
     byte[] outputByte = sb.getBytes(); 
     //copy binary contect to output stream 
     while (in.read(outputByte, 0, 4096) != -1) { 
      out.write(outputByte, 0, 4096); 
     } 
     in.close(); 
     out.flush(); 
     out.close(); 

    } catch (Exception e) { 
    } 

    return null; 
} 

Cuando me fui de la consola de Firebug, estos dos bloques de código escribió "Sedat Basar" en respuesta a la llamada AJAX. Sin embargo, quiero devolver "Sedat BaSAR" como un archivo. ¿Cómo puedo hacer eso?

Gracias de antemano.

+0

acabaste la búsqueda de una solución a esto? – rabs

Respuesta

12

Hay dos formas de hacerlo.

Primero, devuelve un instalador StreamingOutput.

@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response download() { 
    InputStream is = getYourInputStream(); 

    StreamingOutput stream = new StreamingOutput() { 

     public void write(OutputStream output) throws IOException, WebApplicationException { 
      try { 
       output.write(IOUtils.toByteArray(is)); 
      } 
      catch (Exception e) { 
       throw new WebApplicationException(e); 
      } 
     } 
}; 

return Response.ok(stream, MediaType.APPLICATION_OCTET_STREAM).header("content-disposition", "attachment; filename=\"temp.csv\"").build(); 
} 

Puede devolver el tamaño del archivo añadiendo cabecera Content-Length, como el siguiente ejemplo:

return Response.ok(stream, MediaType.APPLICATION_OCTET_STREAM).header("content-disposition", "attachment; filename=\"temp.csv\"").header("Content-Length", getFileSize()).build(); 

Pero si no desea devolver una instancia StreamingOutput, no hay otra opción.

2º - Define la intensidad de entrada como una respuesta de entidad.

@Produces(MediaType.APPLICATION_OCTET_STREAM) 
public Response download() { 
    InputStream is = getYourInputStream(); 

    return Response.code(200).entity(is).build(); 
} 
+0

¿Cómo puedo devolver un archivo con el nombre UTF-8? – vanduc1102

Cuestiones relacionadas