2011-10-04 19 views
8

Jestem nowy przy użyciu CXF i Spring, aby RESTful webservices.RESTful produkuje plik binarny

Oto mój problem: chcę utworzyć usługę, która tworzy "dowolny" rodzaj pliku (może to być obraz, dokument, txt lub nawet pdf), a także XML. Do tej pory otrzymałem ten kod:

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

Nie wiem dokładnie, od czego zacząć, więc proszę o cierpliwość.

EDIT:

Kompletny kod Bryant Luk (dzięki!)

@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

Spróbuj rozpocząć od wyjaśnienia, jaki masz problem. Do tej pory opisałeś tylko to, co zrobiłeś, ale nie wspomniałeś o tym, co się dzieje, gdy działa kod, jakie napotkano błędy, itd. –

+0

Czy próbujesz sprawić, by framework nazwał twoje 'getFile() 'dla każdego żądania w ramach'/download', dzięki czemu może wygenerować żądany plik? Ja * myślę, że * w tym przypadku pytasz, w jaki sposób implementacja 'getFile()' może dowiedzieć się, co faktycznie było wymagane. – Wyzard

+0

@Wyzard tak, mam nadzieję, że nie wymagam wiele za implementację i typ adnotacji –

Odpowiedz

15

Jeśli powróci dowolny plik, może chcesz, aby Twój sposób bardziej "rodzajowe" i powrócić do javax.ws .rs.core.Response które można ustawić nagłówek Content-Type programowo:

@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

Używamy również CXF i wiosna, a to jest mój korzystne 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); 
    } 
}