0

そこで、FTPサイトから画像ファイルをダウンロードし、そこからメタデータを取得してから、Play!を使用してバイナリデータをWebページに返そうとしています。フレームワーク。これが私がコントローラーアクション内で使用している基本的なコードです(簡潔さのためにすべてのエラーチェックを削除しました):

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として出力されるため、入力ストリームからのデータは有効な画像データではないと私は信じています。

誰かがこれを行った経験があり、私を正しい方向に向けることができますか?

4

1 に答える 1

2

SocketInputStreamどういうわけかに変換する必要があるかもしれませんImageInputStream。これがjavadocでImageIO.read()、nullが発生する理由を説明しています:-

現在登録されているものの中から自動的に選択されたImageReaderを使用して、提供されたInputStreamをデコードした結果としてBufferedImageを返します。InputStreamはImageInputStreamにラップされています。登録されたImageReaderが結果のストリームを読み取ることができると主張していない場合、nullが返されます。

getUseCacheおよびgetCacheDirectoryの現在のキャッシュ設定は、作成されるImageInputStreamのキャッシュを制御するために使用されます。

このメソッドは、InputStreamから直接読み取ることができるImageReaderを見つけようとはしません。これは、IIORegistryとImageReaderSpiを使用して実現できます。

このメソッドは、読み取り操作が完了した後、提供されたInputStreamを閉じません。必要に応じて、ストリームを閉じるのは呼び出し元の責任です。

したがって、私はImageReaderあなたが持っているストリームを読み取ることができないと思います、したがってあなたは呼び出しからヌルを取得します。

アップデート

あなたはおそらくこれを行うことができます:-

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

これはあなたのために働きますか?

于 2011-01-29T04:05:42.350 に答える