2011-11-16 98 views
7

嗨,我想从resteasy服务器返回一个文件。为此,我在客户端使用ajax调用rest服务的链接。我想在其余服务中返回文件。我尝试了这两个代码块,但都没有按照我想要的那样工作。从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; 
} 

当我从Firebug控制台检查,无论这些代码块的响应Ajax调用写了“塞达特BaSAR”。但是,我想将“Sedat BaSAR”作为文件返回。我怎样才能做到这一点?

在此先感谢。

+0

您是否最终找到了解决方案? – rabs

回答

12

有两种方法可以实现。

1st - 返回一个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(); 
} 

可以返回文件大小增加Content-Length头,如下面的例子:

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

但是,如果你不想返回StreamingOutput实例,还有其他的选择。

2nd - 将输入流定义为实体响应。

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

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

如何返回名称为UTF-8的文件? – vanduc1102