2011-10-04 146 views
8

我是新的使用CXF和Spring來製作REST風格的Web服務。RESTful生成二進制文件

這是我的問題:我想創建一個產生「任何」類文件(可以是圖像,文檔,txt甚至pdf)的服務,也可以是XML。到目前爲止,我得到了這樣的代碼:

@Path("/download/") 
@GET 
@Produces({"application/*"}) 
public CustomXML getFile() throws Exception; 

我不知道從哪裏開始,所以請耐心等待。

編輯:科比漉的

完整代碼(謝謝!)

@Path("/download/") 
@GET 
public javax.ws.rs.core.Response getFile() throws Exception { 
    if (/* want the pdf file */) { 
     File file = new File("..."); 
     return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM) 
      .header("content-disposition", "attachment; filename =" + file.getName()) 
      .build(); 
    } 

    /* default to xml file */ 
    return Response.ok(new FileInputStream("custom.xml")).type("application/xml").build(); 
} 
+0

試着從解釋你的問題開始。到目前爲止,你只描述了你已經完成的工作,但是你沒有提到代碼運行時會發生什麼,遇到了什麼錯誤等等。 –

+0

你是否想讓框架調用你的'getFile() ''對於'/ download'下的每個請求,所以它可以產生請求的文件?我*想*你在問什麼,在這種情況下,'getFile()'的實現是如何找出實際要求的。 – Wyzard

+0

@Wyzard是的,我希望沒有太多要求實現和註釋類型 –

回答

15

如果它將返回的任何文件,你可能想使你的方法更「通用」,並返回一個javax.ws .rs.core.Response您可以通過編程設置Content-Type頭:

@Path("/download/") 
@GET 
public javax.ws.rs.core.Response getFile() throws Exception { 
    if (/* want the pdf file */) { 
     return Response.ok(new File(/*...*/)).type("application/pdf").build(); 
    } 

    /* default to xml file */ 
    return Response.ok(new FileInputStream("custom.xml")).type("application/xml").build(); 
} 
0

我們還利用CXF和Spring,這是我最好的API。

import javax.ws.rs.core.Context; 

@Path("/") 
public interface ContentService 
{ 
    @GET 
    @Path("/download/") 
    @Produces(MediaType.WILDCARD) 
    InputStream getFile() throws Exception; 
} 

@Component 
public class ContentServiceImpl implements ContentService 
{ 
    @Context 
    private MessageContext context; 

    @Override 
    public InputStream getFile() throws Exception 
    { 
     File f; 
     String contentType; 
     if (/* want the pdf file */) { 
      f = new File("...pdf"); 
      contentType = MediaType.APPLICATION_PDF_VALUE; 
     } else { /* default to xml file */ 
      f = new File("custom.xml"); 
      contentType = MediaType.APPLICATION_XML_VALUE; 
     } 
     context.getHttpServletResponse().setContentType(contentType); 
     context.getHttpServletResponse().setHeader("Content-Disposition", "attachment; filename=" + f.getName()); 
     return new FileInputStream(f); 
    } 
} 
相關問題