java - 使用 Java 中的代理从 Azure Blob 获取图像

标签 java azure blob

我需要使用代理从 Azure blob 存储容器获取图像并将图像保存到 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,我可以通过浏览器打开图像(单独)。

问题:我想直接或通过 URI 处理 blob 内容。如果我在将图像保存到缓冲图像时运行上面的代码, 我收到以下错误。

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

提前致谢。

最佳答案

根据我的经验,您的问题是由没有 SAS token 的 blob url 导致的,无法直接访问。

这是我使用 SAS token 生成 blob url 的示例代码。

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);

关于java - 使用 Java 中的代理从 Azure Blob 获取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55863696/

相关文章:

azure - 向 Microsoft Authenticator 应用程序异步推送通知

c# - 设置 Azure Webjob 时区

javascript - 是否可以通过存储nestJS sdk上传带有元数据的文件?

javascript - 如何将 blob 文件从 Javascript 传递到 ASP.net 中的服务器代码

Java通过Adobe RTMP LCDS DataService推送DataMessage

java - 调用 rs.next() 或 rs.previous() 时结果集指针的增量不均匀

java - jtable多单元格选择

使用 setModel() 更新 JComboBox 时出现 java.lang.IllegalStateException?

oracle - 如何从 sqldeveloper 中的插入语句插入 BLOB 列?

php - 在文件系统与数据库中存储图像的问题