Java Apache использует FTP, как загрузить файл изображения в BufferedImage - PullRequest
0 голосов
/ 29 января 2011

Итак, я пытаюсь загрузить файл изображения с 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» выходит как ноль, так что это заставляет меня поверить, что данные извходной поток не является действительными данными изображения.

У кого-нибудь есть опыт в этом деле, и он может указать мне правильное направление?

1 Ответ

2 голосов
/ 29 января 2011

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

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

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

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

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

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

ОБНОВЛЕНИЕ

Возможно, вы могли бы сделать это: -

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

Это работает для вас?

...