По моему опыту, ваша проблема была вызвана URL-адресом BLOB-объекта без маркера SAS, к которому нельзя получить прямой доступ.
Вот мой пример кода для создания URL-адреса BLOB-объекта с токеном SAS.
String connectionString = "<your storage connection string>"
String containerName = "<your container name>";
String blobName = "<your blob name>";
CloudStorageAccount account = CloudStorageAccount.parse(connectionString);
CloudBlobClient client = account.createCloudBlobClient();
CloudBlobContainer container = client.getContainerReference(containerName);
CloudBlockBlob blob = container.getBlockBlobReference(blobName);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
policy.setPermissions(EnumSet.allOf(SharedAccessBlobPermissions.class));
policy.setSharedAccessStartTime(Date.valueOf(LocalDate.now().minusYears(2)));
policy.setSharedAccessExpiryTime(Date.valueOf(LocalDate.now().plusYears(2)));
String sas = blob.generateSharedAccessSignature(policy, null);
String urlWithSas = String.format("%s?%s", blob.getUri(), sas);
Затем вы можете передать значение urlWithSas
методу ImageIO.read
без прокси, чтобы получить его объект BufferedImage
, как показано ниже.
URL urlOfImage = new URL(urlWithSas);
BufferedImage buffimage = ImageIO.read(urlOfImage );
System.out.println(buffimage.getHeight());
Это работает для меня.
Для использования прокси, вам просто нужно следовать официальному документу JDK Java Networking and Proxies
, чтобы использовать System.setProperty
метод, чтобы сначала включить сетевое взаимодействие с прокси для JVM.
System.setProperty("http.proxyHost", "<your proxy host>");
System.setProperty("http.proxyPort", "<your proxy port>");
Обновление:
Результат кода ниже тот же, что и выше.
HttpURLConnection conn = (HttpURLConnection) urlOfImage.openConnection();
conn.connect();
InputStream input = conn.getInputStream();
BufferedImage buffimage = ImageIO.read(input);