使用Retrofit 2.0和Spring Server下载文件

时间:2016-10-14 18:27:50

标签: java android spring retrofit2 downloadfile

我有一个使用Retrofit 1.9的Android应用程序和一个Spring Server。 Android应用程序可以完美下载文件。我正在尝试迁移到Retrofit 2.0

改造1.9代码

控制器服务器:

@RequestMapping(value = GET_MAP , method = RequestMethod.GET)
public void getMap(@PathVariable("filename")String filename
            ,HttpServletResponse response) throws IOException {
        Files.copy(filename + ".zip", response.getOutputStream());
}

Android界面API

@Streaming
@GET(GET_MAP)
public Response getMap(@Path("filename") long id);

因此,在谷歌搜索迁移以便在Retrofit 2.0中下载文件之后,我必须在我的Android界面Api中使用Call<ResponseBody>。我试过这样的事情:

选项1控制器服务器代码

@RequestMapping(value = GET_MAP , method = RequestMethod.GET)
public void getMap(@PathVariable("filename")String filename
            ,HttpServletResponse response) throws IOException {
        Files.copy(filename + ".zip", response.getOutputStream());
}

选项2控制器服务器代码

@RequestMapping(value = GET_MAP , method = RequestMethod.GET)
public @ResponseBody HttpServletResponse getMap(@PathVariable("filename")String filename
            ,HttpServletResponse response) throws IOException {
        Files.copy(filename + ".zip", response.getOutputStream());
return response;
}

Android界面API

@Streaming
@GET(GET_MAP)
public Call<ResponseBody> getMap(@Path("filename") long id);

但是使用这两个选项,响应长度给我-1:

response.body().contentLength() = -1

我如何迁移Controller方法?

1 个答案:

答案 0 :(得分:1)

在服务器上尝试了几种响应配置后,这对我有用:

1 - 将文件设为new File

2 - 使用org.springframework.core.io.FileSystemResource.FileSystemResource 库将文件作为ResponseBody传递。

@RequestMapping(value = GET_MAP , method = RequestMethod.GET)
public @ResponseBody Resource getMap(@PathVariable("filename")String filename
            ,HttpServletResponse response) throws IOException {
        File file = new File(filename + ".zip");
        return new FileSystemResource(file);
    }