RESTful создает двоичный файл - PullRequest
9 голосов
/ 04 октября 2011

Я недавно использую CXF и Spring для создания веб-сервисов RESTful.

Это моя проблема: я хочу создать сервис, который создает файл "любого" типа (может быть изображение, документ, текст илидаже 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();
}

Ответы [ 2 ]

15 голосов
/ 04 октября 2011

Если он вернет какой-либо файл, вы можете захотеть сделать ваш метод более «универсальным» и вернуть 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 голосов
/ 03 августа 2017

Мы также используем 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);
    }
}
...