java - 使用 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 令牌的 blob 的 url 引起的。
这是我使用 SAS 令牌生成 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);
推荐阅读
- laravel-5 - Laravel 指定 URL 时重定向失败
- laravel - 此路由不支持 POST 方法。支持的方法:GET、HEAD。",...
- regex - 如何在整个excel工作簿中查找正则表达式中的所有单元格?
- jquery - 是否可以添加会为我的代码弹出音频文件的单击功能?
- javascript - 当我单击另一个组件上的按钮时如何更改组件状态
- javascript - 使用本地的微软自定义视觉
- wxpython - 如何编写文本到语音代码,它将读取 wxpython 中每个面板上的消息
- javascript - 使用 css 在情感中嵌套
- python - 使用 pandas 将字符串值重新映射到新标签
- c++ - 正在执行 omp 任务的线程数