Получить изображение из BLOB-объекта Azure с помощью прокси в Java - PullRequest
1 голос
/ 26 апреля 2019

Мне нужно получить изображение из контейнера хранилища BLOB-объектов Azure с помощью прокси-сервера и сохранить изображение в BufferedImage.

             System.out.println("********Initiated******");

            //Set Proxy Host name and Port
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("xx-xx-xxxxx", 8080));
            OperationContext op = new OperationContext();
            op.setProxy(proxy);

            // Retrieve storage account from connection-string.
            CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);

            // Create the blob client.
           CloudBlobClient blobClient = storageAccount.createCloudBlobClient();

           // Get a reference to a container.
           // The container name must be lower case
           CloudBlobContainer container = blobClient.getContainerReference("images");

            //call via this overload
            Iterable<ListBlobItem> blobs = container.listBlobs(null, false, EnumSet.noneOf(BlobListingDetails.class), new BlobRequestOptions(), op);

            URL urlOfImage = null; 
            //Listing contents of container
            for(ListBlobItem blob: blobs) { 
                /*Process the Image. Sample URL from Azure: **https://someWebsite.blob.core.windows.net/images/00001.png***/
                if(((CloudBlockBlob) blob).getName().toLowerCase().contains(".png")) {
                    urlOfImage = blob.getUri().toURL();
                    BufferedImage buffimage = ImageIO.read(urlOfImage);
                }
            }

            System.out.println("********Success*********");

Используя URI, я могу открыть изображение через браузер (отдельно).

Вопрос. Я хочу обрабатывать содержимое BLOB-объекта напрямую или через URI. Если я запускаю свой код выше, когда я сохраняю изображение в буферное изображение, Я получаю следующую ошибку.

Exception in thread "main" javax.imageio.IIOException: Can't get input stream from URL!
at javax.imageio.ImageIO.read(Unknown Source)

Заранее спасибо.

1 Ответ

1 голос
/ 26 апреля 2019

По моему опыту, ваша проблема была вызвана 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...