2011-01-29 139 views
0

因此我试图从FTP站点下载图像文件,从中获取一些元数据,然后使用Play将二进制数据返回到网页!框架。下面是我使用一个控制器动作内部的基本代码(去掉了所有的错误检查简洁):Java apache commons FTP,如何将图像文件下载到BufferedImage

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”出来为空,所以这使我相信,从输入流中的数据是无效的图像数据。

有没有人有这样的经验,可以指出我在正确的方向吗?

+0

你是否将文件类型设置为二进制?你能够成功获取数据,但你自己读取输入流吗? – 2011-01-29 03:34:26

回答

2

您可能需要以某种方式将SocketInputStream转换为ImageInputStream。下面是关于ImageIO.read()的Javadoc,它解释了为什么你会得到一个空: -

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

从 getUseCacheand getCacheDirectory当前高速缓存设置将 被用于控制在所创建的 ImageInputStream中缓存。

此方法不会尝试定位 ImageReaders,它可以从InputStream直接读取 ;可能是使用IIORegistry完成的 和ImageReaderSpi的 。

在读取 操作完成后,此方法不会关闭 提供的InputStream;如果需要,主叫方负责关闭 流。

因此,我认为ImageReader无法读取您拥有的流,因此您会从调用中获得null。

UPDATE

你也许可以做到这一点: -

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

这是否对你的工作?

+0

所以我试过这个:ImageInputStream iis = ImageIO.createImageInputStream(data); BufferedImage bimg = ImageIO.read(iis);而iis包含一个对象,但bimg仍然为null。 – 2011-01-29 04:25:18