Не удается получить входной поток с URL-адреса

Я пытаюсь получить BufferedImage из URL-адреса, но он выдает исключение IIOException. Я уже проверил URL-адрес, и он отлично работает.

Исключение:

javax.imageio.IIOException: Can't get input stream from URL!
javax.imageio.ImageIO.read(ImageIO.java:1395)
de.visionvenue.statify.objects.Statistics.<init>(Statistics.java:60)
de.visionvenue.statify.commands.SetupCommand.onCommand(SetupCommand.java:67)
de.visionvenue.statify.manager.CommandManager.lambda$0(CommandManager.java:26)
java.lang.Thread.run(Thread.java:748)

Вот код, в котором я пытаюсь получить BufferedImage

URL img = new URL(settings.getGuild().getIconUrl());
            
BufferedImage image = ImageIO.read(img);

URL-адрес

https://cdn.discordapp.com/icons/712313516542918717/8b1e61da607cdd67546ffba653a12604.png

Здесь работает нормально. URL img = new URL("https://cdn.discordapp.com/icons/712313516542918717/8b1‌​e61da607cdd67546ffba‌​653a12604.png"); BufferedImage image = ImageIO.read(img);. Не могли бы вы попробовать запустить приведенный выше код в юнит-тесте и посмотреть, нормально ли он работает?

Kaj Hejer 18.12.2020 12:13

Я также пробовал это в пустом проекте. Это сработало. Для получения дополнительной информации см. комментарии в первом ответе.

Redi 18.12.2020 12:24

Когда это сработало, значит, ваша проблема где-то в settings.getGuild().getIconUrl().

Tom 18.12.2020 12:26

Это проблема с запросом URL. Я использую JDA и думаю, что боты Discord могут получить только необработанный URL-адрес, но не файл/изображение из него. Как я мог «эмулировать», что приложение не является ботом Discord.

Redi 18.12.2020 12:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
998
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Учитывая несколько фрагментов кода, трудно понять причину, поскольку это работает для других пользователей, как видно из комментариев.


Оригинальный ответ:

Вместо этого вы хотите использовать класс URLConnection.

Затем вы можете вызвать .connect() и .getInputStream().


Если вам нужна более сложная логика и лучшие API, я бы рекомендовал использовать либо Apache HTTPClient (для любых HTTP-вызовов), либо клиент JAX-RS, который лучше всего подходит для соединений на основе REST, но также может быть используется для любого другого соединения URL. Преимущество последнего заключается в том, что существует несколько реализаций (resteasy, jersey, CXF и многие другие).

Я получаю сообщение об ошибке 403, если пытаюсь использовать URLConnection.

Redi 18.12.2020 12:23

Я попытался использовать Apache HTTPClient, и это сработало. Спасибо за рекомендацию!

Redi 18.12.2020 12:40

Вы можете использовать метод openStream() в URL следующим образом:

String url = settings.getGuild().getIconUrl();
URL img = new URL(url);
BufferedImage image = ImageIO.read(img.openStream());

Не работает. Я получаю ошибку 403

Redi 18.12.2020 12:29

Другие вопросы по теме