Ошибка HTTP 403 означает, что сервер полностью понял ваше намерение запросить это изображение и загрузить его. Однако, по его оценкам, вы не имеете права делать это не из-за ошибки программирования, а из-за того, что вам нельзя это делать.
Обычно следует сделать вывод, что получить это изображение невозможно только по его URL-адресу, и, возможно, вам необходимо предоставить некоторую форму аутентификации вместе с запросом, чтобы доказать серверу, что вам следует разрешить получать изображение.
Однако ясно, просто скопировав / вставив URL-адрес в браузере, что в «нормальных» условиях сервер соглашается выдавать изображение безоговорочно. Сервер отклоняет запрос только тогда, когда он сделан из Java-программы (и, возможно, я тоже не тестировал другие технологии). Остается вопрос: как сервер сообщает, что запрос сделан Java-программой? Или, в более общем плане, как сервер решает, имеете ли вы право делать этот запрос?
Теоретически мы не можем угадать намерения каждого, но для HTTP-серверов, которые хотят отклонять запросы от определенных технологий, обычно это делается на основе HTTP-заголовка User-Agent запроса. Поэтому я решил изменить User-Agent, который Java отправляет по умолчанию, и лгать и притворяться, что запрос сделан Firefox (очень наивно)
Вот код:
URL url = new URL(imagePath);
ByteArrayOutputStream output = new ByteArrayOutputStream();
URLConnection conn = url.openConnection();
conn.setRequestProperty("User-Agent", "Firefox");
try (InputStream inputStream = conn.getInputStream()) {
int n = 0;
byte[] buffer = new byte[1024];
while (-1 != (n = inputStream.read(buffer))) {
output.write(buffer, 0, n);
}
}
byte[] img = output.toByteArray();
ByteBuffer imageBytes = ByteBuffer.wrap(img);
Работает.