下载文件时,restTemplate的响应体会被截断

时间:2017-09-20 22:30:49

标签: spring-mvc spring-boot resttemplate

我使用spring RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add( new ByteArrayHttpMessageConverter()); StreamResourceReader reader = new StreamResourceReader(); restTemplate.execute(uri, HttpMethod.POST, null, new StreamResponseExtractor(reader)); return reader.getEncodedString(); 下载文件。文件很小。 我想得到base64编码的字符串。但是我看到base64编码的字符串被截断了它应该是什么。

这是我的代码

public class StreamResourceReader  {

    private String encodeString;


    public void read(InputStream content) {
        try {
            encodeString = Base64.encodeBase64String(IOUtils.toByteArray(content));
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }
    }

    public ByteArrayOutputStream getOutputStream(){
        return outputStream;
    }

    public String getEncodedString() {
        return encodeString;
    }
}

StreamResourceReader.java

public class StreamResponseExtractor implements ResponseExtractor<InputStream> {

    private StreamResourceReader reader;

    public StreamResponseExtractor(StreamResourceReader resourceReader) {
        this.reader=resourceReader;
    }

    @Override
    public InputStream extractData(ClientHttpResponse response) throws IOException {
        reader.read(response.getBody());
        return null;
   }
}

StreamResponseExtractor.java

ifelse

修改   刚刚发现inputStream被截断了。我不知道为什么以及修复是什么。这里的任何帮助将不胜感激。

由于

1 个答案:

答案 0 :(得分:1)

要确认您的输入流是否确实被截断,您可以尝试一些事情。 IOUtils.toByteArray(content)的作用是在内部缓冲输入流的内容并返回缓冲区。您可以将缓冲区数组的长度与文件实际表示的字节数组进行比较。您可以使用以下代码

执行后者
String filePath = "/test.txt";
byte[] fileByteArray= Files.readAllBytes(Paths.get(filePath));

ClientHttpResponse(http响应的客户端视图)也有可用的输入流,您可以检查内容。

InputStream getBody() throws IOException;

作为此场景的测试,我使用Rest Template(使用您共享的代码)和使用Spring Boot再次下载文件的服务创建了Spring boot Rest客户端。在比较下载与直接文件访问的基本编码字符串时,两者都返回相同的内容(使用String equals方法进行比较)。

更新:另一件值得尝试的事情就是使用java.net.HttpURLConnection 在一个简单的程序中(有关帮助请参阅here)并尝试下载内容并检查这是否正常,因为在所有Spring抽象的背后,在这种情况下使用的基础对象仅为HttpURLConnection

SimpleClientHttpResponse extends AbstractClientHttpResponse {

public InputStream getBody() throws IOException {
        InputStream errorStream = this.connection.getErrorStream();
        this.responseStream = (errorStream != null ? errorStream : this.connection.getInputStream());
        return this.responseStream;
    }

...........
...........
}

如果这也给你带来同样的问题,那么现在是时候看一下服务器端了。可能是服务器没有发送完整的数据。