使用Java中的代理从Azure Blob获取图像 [英] Get Image from Azure Blob using Proxy In Java

查看:281
本文介绍了使用Java中的代理从Azure Blob获取图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要使用代理从Azure blob存储容器中获取图像并将图像保存到BufferedImage.

I need get Image from Azure blob storage container using Proxy and save the Image to 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,我可以(分别)通过浏览器打开图像.

By using the URI, i can open the image via browser(seperatly).

问题:我想直接或通过URI处理Blob内容.如果我在将Image保存到缓冲Image时运行上述代码, 我收到以下错误消息.

Question: I want to process the blob content directly or via URI. If i run my above code when i save Image to buffered Image, I get the following Error.

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

谢谢.

推荐答案

根据我的经验,您的问题是由不带SAS令牌且无法直接访问的blob的网址引起的.

Per my experience, your issue was caused by the url of blob without SAS token which can not be accessed directly.

这是我的示例代码,用于使用SAS令牌生成Blob网址.

Here is my sample code to generate a blob url with SAS token.

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对象,如下所示.

Then, you can pass the urlWithSas value to the method ImageIO.read without proxy to get its BufferedImage object, as below.

URL urlOfImage = new URL(urlWithSas);
BufferedImage buffimage = ImageIO.read(urlOfImage );
System.out.println(buffimage.getHeight());

对我有用.

对于使用代理,您只需遵循JDK官方文档

For using proxy, you just need to follow the JDK offical document Java Networking and Proxies to use System.setProperty method to enable networking with proxy for JVM at first.

System.setProperty("http.proxyHost", "<your proxy host>");
System.setProperty("http.proxyPort", "<your proxy port>");


更新:


Update:

下面的代码结果与上面的代码相同.

The result of the code below is the same as the above.

HttpURLConnection conn = (HttpURLConnection) urlOfImage.openConnection();
conn.connect();
InputStream input = conn.getInputStream();
BufferedImage buffimage = ImageIO.read(input);

这篇关于使用Java中的代理从Azure Blob获取图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆