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

Вы задаете тип файла двоичным? Можете ли вы получить данные успешно, но сами читаете входной поток? –

ответ

2

Возможно, вам необходимо каким-то образом преобразовать SocketInputStream в ImageInputStream. Вот Javadoc на ImageIO.read() и это объясняет, почему вы получаете нуль: -

Возвращает BufferedImage в результате декодирования входящего в комплект InputStream с ImageReader выбранного автоматически из числа тех, кто в настоящее время не зарегистрировано. InputStream завернут в ImageInputStream. Если не зарегистрировано. ImageReader утверждает, что способен считывать результирующий поток, null возвращается.

текущие настройки кэша из getUseCacheand getCacheDirectory будет использоваться для управления кэшированием в ImageInputStream, который создается.

Этот метод не пытается найти ImageReaders, которые могут напрямую считывать из InputStream; который может быть выполнен с использованием IIORegistry и ImageReaderSpi.

Этот метод не закрывает при условии, что InputStream после завершения операции чтения ; это ответственность звонящего закрыть поток, при желании.

Итак, я полагаю, что ImageReader не может прочитать поток, который у вас есть, и вы получите нуль от вызова.

UPDATE

Вы могли бы сделать это: -

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

ли эта работа для вас?

+0

Итак, я пробовал это: ImageInputStream iis = ImageIO.createImageInputStream (данные); BufferedImage bimg = ImageIO.read (iis); и iis содержит объект, но bimg все равно null. –

+0

Weird .... можете ли вы сделать ImageIO.getImageReaders (iis) '? Мне любопытно, почему именно ImageReaders вы вернетесь, или если он пуст? Другое дело, можете ли вы попробовать любой формат изображения, скажем, jpg? – limc

+0

его пуст :(Я попробую jpg –

Смежные вопросы