代码之家  ›  专栏  ›  技术社区  ›  brain storm

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

  •  0
  • brain storm  · 技术社区  · 8 年前

    RestTemplate

    这是我的密码

    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();
    

    StreamResourceReader。Java语言

    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;
        }
    }
    

    StreamResponseExtractor。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;
       }
    }
    

    编辑

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Shailendra    8 年前

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

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

    此外,ClientHttpResponse(http响应的客户端视图)也提供了inputstream,您可以检查其内容。

    InputStream getBody() throws IOException;
    

    作为对该场景的测试,我使用Rest模板(使用您共享的代码)创建了spring boot Rest客户端,并使用spring boot再次创建了文件下载服务。在比较下载和直接文件访问的基本编码字符串时,两者都返回相同的内容(使用 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;
        }
    
    ...........
    ...........
    }