0

所以我试图从 FTP 站点下载图像文件,从中获取一些元数据,然后使用 Play! 将二进制数据返回到网页!框架。这是我在控制器操作中使用的基本代码(为简洁起见,删除了所有错误检查):

FTPClient ftp = new FTPClient();
ftp.connect(site.host, site.port);
ftp.login(site.username, site.password);
InputStream is = ftp.retrieveFileStream("somefile.png");
Response.current().contentType = "image/png";
renderBinary(is);

我知道输入流的真正类型是 SocketInputStream,我需要做一些特别的事情才能使用它吗?

我也试过这个:

BufferedImage bimg = ImageIO.read(is);

但是“bimg”显示为空,所以这让我相信输入流中的数据不是有效的图像数据。

有没有人有这样做的经验并且可以指出我正确的方向?

4

1 回答 1

2

您可能需要以某种方式转换SocketInputStreamImageInputStream. 这是javadoc ImageIO.read(),它解释了为什么你得到一个空值: -

返回一个 BufferedImage 作为使用从当前注册的那些中自动选择的 ImageReader 解码提供的 InputStream 的结果。InputStream 包装在 ImageInputStream 中。如果没有注册的 ImageReader 声称能够读取结果流,则返回 null。

getUseCache 和 getCacheDirectory 中的当前缓存设置将用于控制创建的 ImageInputStream 中的缓存。

此方法不会尝试定位可以直接从 InputStream 读取的 ImageReader;这可以使用 IIORegistry 和 ImageReaderSpi 来完成。

该方法不会在读取操作完成后关闭提供的 InputStream;如果需要,调用者有责任关闭流。

因此,我假设ImageReader无法读取您拥有的流,因此您从调用中获得了 null。

更新

你可能会这样做: -

BufferedImage bimg = ImageIO.read(ImageIO.createImageInputStream(yourSocketInputStream));

这对你有用吗?

于 2011-01-29T04:05:42.350 回答