使用 getResponse().getOutputStream().write 缺少图像的底部

Missing Bottom part of image using getResponse().getOutputStream().write

我从 post 回复

得到了图片
PostMethod post = new PostMethod(action);
HttpClient httpClient = createHttpClient();

........

httpClient.executeMethod(post);


try {
            log.info("post successfully");
            String contentType = post.getResponseHeader("Content-type").getValue();
            int contentLength = (int) post.getResponseContentLength();
            byte[] responseBody = FileUtils.convertInputStreamtoByteArray(post.getResponseBodyAsStream());
            log.info("get response sucessfully : size "+ responseBody.length +" contentLength " + contentLength);
            return new ReturnBean(null, responseBody,contentType,contentLength);
        } catch (Exception e) {
            log.error(e.getMessage());
            log.error(e.getStackTrace());
            e.printStackTrace();
            throw new ResponseFailedException(e.getMessage());
        }

这就是我将输入流转换为字节数组的方式。

public static byte[] convertInputStreamtoByteArray(InputStream is){
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            byte[] buf = new byte[1024];
            int i = 0;
            while ((i = is.read(buf)) >= 0) {
                baos.write(buf, 0, i);
            }
            is.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return baos.toByteArray();
    }

这就是我 return 图像作为响应的方式。

byte[] imageSource = (byte[])returnStream.getBean();
            log.info("imageSource " + imageSource.length);
            getResponse().setContentType((String) returnStream.getBean2());
            getResponse().setContentLength((Integer) returnStream.getBean3());
            getResponse().getOutputStream().write(imageSource);
            getResponse().getOutputStream().flush();

我能够打印出图像,但我遇到了问题,因为它的底部丢失了。我检查了我得到的字节大小,它等于实际图像的大小。

当我使用 IOUtils.copyLarge(); 而不是我的方法时 convertInputStreamtoByteArray

ServletOutputStream outputStream = getResponse().getOutputStream();
            InputStream inputStream = (InputStream) returnStream.getBean();
            IOUtils.copyLarge(inputStream , outputStream);

有效。我不知道发生了什么,因为我刚才用过它,但没有用。