相关疑难解决方法(0)

如何使用RestTemplate转发大文件?

我有一个Web服务调用,通过它可以上传zip文件.然后将文件转发到另一个服务进行存储,解压缩等.现在文件存储在文件系统中,然后构建FileSystemResource.

Resource zipFile = new FileSystemResource(tempFile.getAbsolutePath());
Run Code Online (Sandbox Code Playgroud)

我可以使用ByteStreamResource以节省时间(在转发之前不需要在磁盘上保存文件)但是为此我需要构建一个字节数组.如果是大文件,我将收到"OutOfMemory:java heap space"错误.

ByteArrayResource r = new ByteArrayResource(inputStream.getBytes());
Run Code Online (Sandbox Code Playgroud)

任何使用RestTemplate转发文件而不会出现OutOfMemory错误的解决方案?

java groovy spring resttemplate

36
推荐指数
3
解决办法
3万
查看次数

通过@Bean 提供的 RestTemplateBuilder 流式上传缓冲完整文件

我正在构建一个用于上传大文件(数 GB)的反向代理,因此想要使用不缓冲整个文件的流模型。大缓冲区会引入延迟,更重要的是,它们可能会导致内存不足错误。

我的客户端类包含

@Autowired private RestTemplate restTemplate;

@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {

    int REST_TEMPLATE_MODE = 1; // 1=streams, 2=streams, 3=buffers

    return 
        REST_TEMPLATE_MODE == 1 ? new RestTemplate() :
        REST_TEMPLATE_MODE == 2 ? (new RestTemplateBuilder()).build() :
        REST_TEMPLATE_MODE == 3 ? restTemplateBuilder.build() : null;
}
Run Code Online (Sandbox Code Playgroud)

public void upload_via_streaming(InputStream inputStream, String originalname) {

    SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
    requestFactory.setBufferRequestBody(false);
    restTemplate.setRequestFactory(requestFactory);

    InputStreamResource inputStreamResource = new InputStreamResource(inputStream) {
        @Override public String getFilename() { return originalname; }
        @Override public long contentLength() { return -1; …
Run Code Online (Sandbox Code Playgroud)

streaming spring reverse-proxy resttemplate spring-boot

5
推荐指数
1
解决办法
1866
查看次数