【问题标题】:Java apache commons FTP, how to download image file to BufferedImageJava apache commons FTP,如何将图像文件下载到BufferedImage
【发布时间】:2011-01-29 03:08:42
【问题描述】:

所以我尝试从 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' 显示为 null,所以这让我相信来自输入流的数据不是有效的图像数据。

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

【问题讨论】:

  • 您是否将文件类型设置为二进制?您是否能够成功获取数据但自己读取输入流?

标签: java ftp playframework javax.imageio apache-commons-net


【解决方案1】:

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

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

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

此方法不会尝试定位 可以直接读取的 ImageReader 来自输入流;那可能 使用 IIORegistry 和 ImageReaderSpi。

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

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

更新

你可能会这样做:-

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

这对你有用吗?

【讨论】:

  • 所以我尝试了这个:ImageInputStream iis = ImageIO.createImageInputStream(data); BufferedImage bimg = ImageIO.read(iis);并且 iis 包含一个对象,但 bimg 仍然为空。
  • 奇怪....你能做到ImageIO.getImageReaders(iis)吗?我很好奇为什么你会返回什么样的 ImageReaders,或者它是空的?另一件事,你能尝试任何图像格式,比如 jpg 吗?
  • 好的,解决方法是使用 ftp.retrieveFile 方法并将其保存到 tmp 位置。然后我可以毫无问题地将它读入 BufferedImage。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2018-10-04
  • 2013-10-18
  • 1970-01-01
  • 2012-01-25
  • 2018-09-17
相关资源
最近更新 更多