Java - Невозможно прочитать изображение по URL - PullRequest
0 голосов
/ 05 октября 2018

Я везде искал ответ и ничего не помогало.

Вот мой код:

BufferedImage img1 = ImageIO.read(new File(dir1));
URL url = new URL(image_srcURL);
BufferedImage img2 = 
ImageIO.read(url.openStream());

Теперь я получаю исключение ниже, когда пытаюсь прочитать URL.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: не удается найти действительный путь сертификации для запрошенной цели в java.base / sun.security.ssl.Alerts.getSSLException (Alerts.java:198) в java.base / sun.security.ssl.SSLSocketImpl.fatal (SSLSocketImpl.java:1974) в java.base / sun.security.ssl.Handshaker.fatalSE (Handshaker.java:345) в java.base / sun.security.ssl.Handshaker.fatalSE (Handshaker.java:339) в java.base / sun.security.ssl.ClientHandshaker.checkServerCerts (ClientHandshaker.jpg: 1968) в java.base / sun.security.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:1777) в java.base / sun.security.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:264 /) в java.basesun.security.ssl.Handshaker.processLoop (Handshaker.java:1098) в java.base / sun.security.ssl.Handshaker.processRecord (Handshaker.java:1026) в java.base / sun.security.ssl.SSLSocketImpl.processInputRecord (SSLSocketImpl.java:1137) в java.base / sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:1074) в java.base / sun.security.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:9).base / sun.security.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1402) в java.base / sun.security.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1429) в java.base.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1413) на java.base / sun.net.www.protocol.https.HttpsClient.afterConnect (HttpsClient.java:567) на java.base / sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:185) в java.base / sun.net.www.protocol.http.HttpURLConnection.getInputStream0 (HttpURLConnection.java:1581 / sun.net.w.wp.http..httpURLConnection.getInputStream (HttpURLConnection.java:1509) по адресу java.base / sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:245) в com.folderName1AjData.Tol.606) в com.folderName.VendorTests.SettingsPage.editCompDets (SettingsPage.java:562) в com.folderName.VendorTests.SettingsPage.runTest (SettingsPage.java:62) в com.folderName.Vendor.ornd (Vendor.ornd)) at com.folderName.Main.main (Main.java:40) Причина: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенногоцель в java.base / sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java:385) в java.base / sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:290) в java.base / sun.security.validator.Validator.validate (Validator.java:264) в java.base / sun.security.ssl.X509TrustManagerImpl.validate (X509TrustManagerImpl.java:343) в java.base / sun.security.ssl.X509TrustManagerImpl.checkTrusted (X509TrustManagerImpl.java:226) в java.base / sun.security.ssl.X509TrustManagerImpl.lava1.base / sun.security.ssl.ClientHandshaker.checkServerCerts (ClientHandshaker.java:1947) ... еще 20 причин: sun.security.provider.certpath.SunCertPathBuilderException: не удалось найти действительный путь сертификации для запрошенной цели в java.base/sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) в java.base / sun.security.provider.certpath.SunCertPathBuilder.engineBuild (SunCertPathBuilder.java.java6) jj..cert.CertPathBuilder.build (CertPathBuilder.java:297) вjava.base / sun.security.validator.PKIXValidator.doBuild (PKIXValidator.java:380) ... еще 26

Любая помощь будет отличной.Я пытаюсь прочитать изображение внутри URL-адреса и сравнить его с существующим файлом.Здесь не было вопросов, которые дали ответ.

Редактировать:

Я попытался ввести в моей командной строке "keytool -list -keystore keystore", но это показало мне только доверенные контакты.Решение пока не работает.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Ниже приведен пример того, как я это реализовал.Код читает тело ответа в awt BufferedImage, затем записывает в файл .jpg, затем читает файл обратно в байтовый массив и затем удаляет файл.Я уверен, что нашел помощь с этим на SO, но у меня нет удобного ответа.Я постараюсь найти это, чтобы я мог процитировать.Надеюсь, это поможет вам!

** Отредактируйте, как @Srikanthkumar упоминает в своем ответе, вам также нужно будет получить сертификат и добавить его в доверенное хранилище вашей JVM.Вы можете получить это через браузер через любой браузер, у которого у вас есть инструменты для исследования.

import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.nio.file.Files;
import java.util.Base64;
import java.util.UUID;
import javax.imageio.ImageIO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public String getImage(String productNumber) throws EcomWebException {

try {
    BufferedImage image = ImageIO.read(url);
    File file = new File(guid.toString() + ".jpg");
    ImageIO.write(image, "jpg", file);
    String base64ImageString = Base64.getEncoder().encodeToString(Files.readAllBytes(file.toPath()));
    file.delete();
    return base64ImageString;
} catch (Exception e) {
    throw new EcomWebException(IMAGE_NOT_FOUND_MESSAGE + productNumber, e);
}
}
0 голосов
/ 05 октября 2018

Сначала вам нужно получить сертификат сервера, добавить его в файл keystone, либо в хранилище доверенных сертификатов java в jre, либо в отдельный файл.Если вы создаете новое хранилище доверенных сертификатов, убедитесь, что вы указали хранилище доверенных сертификатов для своей программы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...