2011-01-29 141 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