我使用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被截断了。我不知道为什么以及修复是什么。这里的任何帮助将不胜感激。
由于
答案 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;
}
...........
...........
}
如果这也给你带来同样的问题,那么现在是时候看一下服务器端了。可能是服务器没有发送完整的数据。