Как преобразовать URL Http (URL изображения) в байтовый буфер или в байтах? - PullRequest
0 голосов
/ 25 июня 2018

Я пробовал некоторые функции для преобразования изображения URL в буфер байтов, но это не работает. Это показывает ошибку IOException

String imagePath = "https://www.clearias.com/up/UPSC-Civil-Services-Mains-Exam-2018-Timetable-V1.png";

Попробуйте 1:

URL u = new URL(imagePath);
int contentLength = u.openConnection().getContentLength();
InputStream openStream = u.openStream();
byte[] binaryData = new byte[contentLength];
openStream.read(binaryData);
ByteBuffer imageBytes = ByteBuffer.wrap(openStream);

Это показывает ошибку, когда я оборачиваю openStream в ByteBuffer

"Метод wrap (byte []) в типе ByteBuffer не применим для Аргументы (InputStream) "

Попробуйте 2:

    URL url = new URL(imagePath);
    ByteArrayOutputStream output = new ByteArrayOutputStream();

    try (InputStream inputStream = url.openStream()) {
        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);    

Я также пробовал эту функцию, но она показывает эту ошибку:

java.io.IOException: сервер вернул код ответа HTTP: 403 для URL: https://www.clearias.com/up/UPSC-Civil-Services-Mains-Exam-2018-Timetable-V1.png

Попробуйте 3: И еще

byte[] img = Base64.encodeBase64(IOUtils.toByteArray((new URL(imagePath)).openStream()), true);    

Эта строка также дает мне ошибку

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Ошибка 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);

Работает.

0 голосов
/ 25 июня 2018

Я думаю, что есть некоторая проблема с URL.

Используйте Apache commons-io Apache commons-io

Ниже приведен пример кода:

import org.apache.commons.io.IOUtils;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;

public class DownloadImage {
    public static void main(String[] args) {

        try {
            URL url = new URL("https://en.wikipedia.org/wiki/Car#/media/File:401_Gridlock.jpg");
            System.out.println(Arrays.toString(downloadFile(url)));
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

    private static byte[] downloadFile(URL url) {
        try {
            URLConnection conn = url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.connect();

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            IOUtils.copy(conn.getInputStream(), baos);

            return baos.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

ВЫХОД: [..., 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 10]

...