从spring boot REST服务下载大文件

时间:2018-02-07 09:25:37

标签: spring spring-boot

我目前正在编写一个带有spring boot的REST服务,它应该提供文件下载,i。即客户端应用程序可以从服务下载文件。一个文件可以是几千兆字节(有时比主存大),i。即将文件加载到主内存不是一个选项。因此,在向客户端发送文件时,我需要某种流媒体机制。

网上一个有希望的解决方案(取自here):

@RestController
// ...
@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
    return new FileSystemResource(myService.getFileFor(fileName)); 
}

但它不起作用。我明白了:

  

java.lang.IllegalStateException:不支持的资源类:class org.springframework.core.io.FileSystemResource           在org.springframework.http.converter.ResourceHttpMessageConverter.readInternal(ResourceHttpMessageConverter.java:100)

我研究过但不知道是什么导致了这个问题。我尝试了其他方法(例如Downloading a file from spring controllers),但我得到了同样的错误。有谁知道为什么解决方案似乎适用于其他人而不适合我?

编辑:这是我调用REST服务的地方(jUnit测试用例):

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DownloadTest {

    @LocalServerPort
    private int port;

    private RestTemplate template;

    private String requestPath;

    @Before
    public void setUp() throws Exception {
        template = new RestTemplate();
        requestPath = "http://localhost:" + port + "/files/download";
    }

    @Test
    public void test() {
        Resource FileSystemResource =
            template.getForObject(requestPath, FileSystemResource.class);
    }

}

2 个答案:

答案 0 :(得分:0)

RestController的代码按预期工作,内存占用量很小(文件永远不会完全加载到主内存中)。

可以找到适合我的客户端代码(内存占用很少)here

答案 1 :(得分:0)

我修复了java.lang.IllegalStateException:更改此

的不受支持的资源错误
Resource FileSystemResource = 
            template.getForObject(requestPath, FileSystemResource.class);


为此

  Resource FileSystemResource =
            template.getForObject(requestPath, Resource .class);